estro-webmcp.vercel.app
A photo editor that does not assume you know what saturation means. Describe what you want and an agent moves the real controls, then tells you which ones and what they do. Everything stays in your…
First seen 2026-11-05 · Last seen 2026-11-05 · Source: webmcp.com
Answer 22 · Act 34 · Transact 0 · Score: Not yet scored
Tool inspector
apply_layer_operation
Every edit to a photo layer, chosen with the operation field. Structure: add, remove, duplicate, reorder, group, ungroup, move between groups, rename, show, hide, lock. Placement: transform, crop, crop ratio, reset, quarter-turn, fit, fill, straighten, flip, align, distribute, free transform, perspective, warp, lens correction. Appearance: opacity, blend mode, clip to the layer below, masks, and an effect container holding exposure, levels, curves, vibrance, colour balance, selective colour, black and white, gradient map, photo filter, 3D LUT, shadows and highlights, replace colour, posterize, threshold, invert, equalize. Content: text, shapes, fills, adjustment layers, layer styles, brush and retouch strokes, keyframes. Everything is stored as settings and re-run at export size, so any of it can be changed or removed later. Each operation reads only the fields it needs; the rest are ignored. Alignment and grouping act only on the layers named.
Page: /
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
projectId |
string | yes | — |
expectedRevisionId |
string | no | — |
operation |
— | yes | — |
content |
string | no | Text content for add_text or a whole-block replacement. |
range |
object | no | Character range: start and end. |
insert |
string | no | — |
font |
object | no | Family, weight, italic. |
sizePx |
number | no | — |
colour |
string | no | — |
trackingMille |
number | no | — |
paragraph |
object | no | Alignment, leading, indents, spacing, list. |
paragraphIndex |
integer | no | — |
layout |
object | no | Point text, or a paragraph box with a width and height. |
shape |
object | no | Rectangle, ellipse, polygon, or path commands. |
fill |
object | no | — |
stroke |
object,null | no | — |
paint |
object | no | Fill paint for a fill layer: solid, gradient, or a swatch. |
style |
object | no | A layer style: kind is one of stroke, drop_shadow, inner_shadow, glow, overlay, plus that kind's own settings. |
styleId |
string | no | — |
corners |
object,null | no | Four corners in reading order — topLeft, topRight, bottomRight, bottomLeft — each {x,y} in document pixels. Null clears the correction. |
sliders |
object | no | Perspective as angles instead of corners: verticalDeg, horizontalDeg, rotationDeg, scale. |
columns |
integer | no | Warp grid width. |
rows |
integer | no | Warp grid height. |
point |
object | no | Moves one warp control point: column, row, and an offset {x,y} in fractions of the layer's size. |
clear |
boolean | no | Removes the warp. |
correction |
object | no | Lens correction: distortion, distortionFine, chromaticAberration, vignette, each -1 to 1. |
brush |
object | no | Brush settings: kind (brush, pencil, eraser, clone, dodge, burn, sponge, blur, sharpen, smudge, red_eye), sizePx, hardness, flow, opacity, spacing, roundness, angleDeg, scatter. Only what is given changes. |
cloneOffset |
object,null | no | For a clone stamp: {x,y}, the distance from where it paints to where it reads. Required for clone. |
strength |
number | no | How strongly a retouching brush works. Not opacity: these change what is already there. Defaults to 0.5. |
dynamics |
object | no | What the pen drives: pressureToSize, pressureToOpacity, pressureToFlow, tiltToRoundness, rotationToAngle, velocityToSize, each 0 to 1. |
points |
array | no | Pointer samples: x, y, and optionally pressure, tiltDeg, rotationDeg, velocity. Pressure defaults to full, so a mouse draws at the brush's stated size. |
strokeId |
string | no | — |
selectionId |
string | no | A saved selection the stroke or fill is confined to. |
simplifyPx |
number | no | Thins the points to the ones that describe the shape. 0 keeps every sample. |
propertyPath |
string | no | An animatable property, such as transform.x or opacity. |
time |
object | no | A rational time: numerator and denominator. |
value |
number | no | — |
interpolation |
— | no | — |
handles |
object | no | Bezier control handles, for custom easing. |
keyframeId |
string | no | — |
blendMode |
— | no | — |
clipToBelow |
boolean | no | — |
mask |
object | no | Mask source, feather, density, inverted, and enabled. |
maskId |
string | no | — |
effectId |
string | no | — |
enabled |
boolean | no | — |
parameters |
object | no | Adjustment values for an effect or an adjustment layer. |
profile |
object | no | A camera profile or a creative look: id, name, kind ('camera' or 'creative'), and an ordered list of colour operations. Applied before everything else, so later edits are edits away from it. Its operations are copied onto the layer, so editing the profile later does not change photographs already developed with it. |
remove |
— | no | For apply_profile: removes the profile of that kind. |
colourOperation |
object | no | One tone or colour operator for an effect. `kind` is one of exposure, levels, curves, vibrance, colour_balance, selective_colour, black_and_white, channel_mixer, gradient_map, photo_filter, lut, shadows_highlights, replace_colour, posterize, threshold, invert, equalize, plus that kind's own settings. Replaces the operator whole on an update, because a curve and a lookup table share no fields. |
assetId |
string | no | — |
layerId |
string | no | — |
groupId |
string,null | no | — |
layerIds |
array | no | — |
name |
string | no | — |
fit |
— | no | — |
mode |
— | no | — |
toIndex |
integer | no | — |
visible |
boolean | no | — |
locked |
boolean | no | — |
opacity |
number | no | — |
rotationDeg |
number | no | — |
turns |
integer | no | — |
ratio |
number,null | no | — |
axis |
— | no | — |
edge |
— | no | — |
reference |
— | no | — |
keyLayerId |
string,null | no | — |
transform |
object | no | — |
crop |
object | no | — |
Raw JSON schema
{
"type": "object",
"additionalProperties": false,
"properties": {
"projectId": {
"type": "string",
"minLength": 1
},
"expectedRevisionId": {
"type": "string"
},
"operation": {
"enum": [
"add_image",
"remove",
"duplicate",
"reorder",
"group",
"ungroup",
"move_into_group",
"rename",
"set_visibility",
"set_lock",
"set_opacity",
"transform",
"crop",
"set_crop_ratio",
"reset_transform",
"rotate_quarter",
"fit",
"straighten",
"flip",
"align",
"distribute",
"set_blend_mode",
"set_clipping",
"add_mask",
"update_mask",
"remove_mask",
"add_effect",
"update_effect",
"remove_effect",
"reorder_effect",
"set_keyframe",
"remove_keyframe",
"set_track_enabled",
"clear_animation",
"add_text",
"edit_text",
"add_shape",
"set_paint",
"add_adjustment_layer",
"add_fill_layer",
"add_style",
"update_style",
"remove_style",
"free_transform",
"set_perspective",
"warp",
"correct_lens",
"apply_profile",
"paint_stroke",
"undo_stroke",
"restyle_stroke",
"fill_region"
]
},
"content": {
"type": "string",
"maxLength": 20000,
"description": "Text content for add_text or a whole-block replacement."
},
"range": {
"type": "object",
"description": "Character range: start and end."
},
"insert": {
"type": "string",
"maxLength": 20000
},
"font": {
"type": "object",
"description": "Family, weight, italic."
},
"sizePx": {
"type": "number",
"minimum": 1,
"maximum": 2000
},
"colour": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$"
},
"trackingMille": {
"type": "number",
"minimum": -500,
"maximum": 2000
},
"paragraph": {
"type": "object",
"description": "Alignment, leading, indents, spacing, list."
},
"paragraphIndex": {
"type": "integer",
"minimum": 0
},
"layout": {
"type": "object",
"description": "Point text, or a paragraph box with a width and height."
},
"shape": {
"type": "object",
"description": "Rectangle, ellipse, polygon, or path commands."
},
"fill": {
"type": "object"
},
"stroke": {
"type": [
"object",
"null"
]
},
"paint": {
"type": "object",
"description": "Fill paint for a fill layer: solid, gradient, or a swatch."
},
"style": {
"type": "object",
"description": "A layer style: kind is one of stroke, drop_shadow, inner_shadow, glow, overlay, plus that kind's own settings."
},
"styleId": {
"type": "string"
},
"corners": {
"type": [
"object",
"null"
],
"description": "Four corners in reading order — topLeft, topRight, bottomRight, bottomLeft — each {x,y} in document pixels. Null clears the correction."
},
"sliders": {
"type": "object",
"description": "Perspective as angles instead of corners: verticalDeg, horizontalDeg, rotationDeg, scale."
},
"columns": {
"type": "integer",
"minimum": 2,
"maximum": 16,
"description": "Warp grid width."
},
"rows": {
"type": "integer",
"minimum": 2,
"maximum": 16,
"description": "Warp grid height."
},
"point": {
"type": "object",
"description": "Moves one warp control point: column, row, and an offset {x,y} in fractions of the layer's size."
},
"clear": {
"type": "boolean",
"description": "Removes the warp."
},
"correction": {
"type": "object",
"description": "Lens correction: distortion, distortionFine, chromaticAberration, vignette, each -1 to 1."
},
"brush": {
"type": "object",
"description": "Brush settings: kind (brush, pencil, eraser, clone, dodge, burn, sponge, blur, sharpen, smudge, red_eye), sizePx, hardness, flow, opacity, spacing, roundness, angleDeg, scatter. Only what is given changes."
},
"cloneOffset": {
"type": [
"object",
"null"
],
"description": "For a clone stamp: {x,y}, the distance from where it paints to where it reads. Required for clone."
},
"strength": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "How strongly a retouching brush works. Not opacity: these change what is already there. Defaults to 0.5."
},
"dynamics": {
"type": "object",
"description": "What the pen drives: pressureToSize, pressureToOpacity, pressureToFlow, tiltToRoundness, rotationToAngle, velocityToSize, each 0 to 1."
},
"points": {
"type": "array",
"maxItems": 4000,
"items": {
"type": "object"
},
"description": "Pointer samples: x, y, and optionally pressure, tiltDeg, rotationDeg, velocity. Pressure defaults to full, so a mouse draws at the brush's stated size."
},
"strokeId": {
"type": "string"
},
"selectionId": {
"type": "string",
"description": "A saved selection the stroke or fill is confined to."
},
"simplifyPx": {
"type": "number",
"minimum": 0,
"maximum": 20,
"description": "Thins the points to the ones that describe the shape. 0 keeps every sample."
},
"propertyPath": {
"type": "string",
"description": "An animatable property, such as transform.x or opacity."
},
"time": {
"type": "object",
"description": "A rational time: numerator and denominator."
},
"value": {
"type": "number"
},
"interpolation": {
"enum": [
"linear",
"hold",
"ease_in",
"ease_out",
"ease_in_out",
"bezier"
]
},
"handles": {
"type": "object",
"description": "Bezier control handles, for custom easing."
},
"keyframeId": {
"type": "string"
},
"blendMode": {
"enum": [
"normal",
"multiply",
"screen",
"overlay",
"darken",
"lighten",
"color-dodge",
"color-burn",
"hard-light",
"soft-light",
"difference",
"exclusion",
"hue",
"saturation",
"color",
"luminosity"
]
},
"clipToBelow": {
"type": "boolean"
},
"mask": {
"type": "object",
"description": "Mask source, feather, density, inverted, and enabled."
},
"maskId": {
"type": "string"
},
"effectId": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"parameters": {
"type": "object",
"description": "Adjustment values for an effect or an adjustment layer."
},
"profile": {
"type": "object",
"description": "A camera profile or a creative look: id, name, kind ('camera' or 'creative'), and an ordered list of colour operations. Applied before everything else, so later edits are edits away from it. Its operations are copied onto the layer, so editing the profile later does not change photographs already developed with it."
},
"remove": {
"enum": [
"camera",
"creative"
],
"description": "For apply_profile: removes the profile of that kind."
},
"colourOperation": {
"type": "object",
"description": "One tone or colour operator for an effect. `kind` is one of exposure, levels, curves, vibrance, colour_balance, selective_colour, black_and_white, channel_mixer, gradient_map, photo_filter, lut, shadows_highlights, replace_colour, posterize, threshold, invert, equalize, plus that kind's own settings. Replaces the operator whole on an update, because a curve and a lookup table share no fields."
},
"assetId": {
"type": "string"
},
"layerId": {
"type": "string"
},
"groupId": {
"type": [
"string",
"null"
]
},
"layerIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 500
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"fit": {
"enum": [
"fit",
"fill",
"actual"
]
},
"mode": {
"enum": [
"fit",
"fill",
"actual"
]
},
"toIndex": {
"type": "integer",
"minimum": 0
},
"visible": {
"type": "boolean"
},
"locked": {
"type": "boolean"
},
"opacity": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"rotationDeg": {
"type": "number",
"minimum": -360,
"maximum": 360
},
"turns": {
"type": "integer",
"minimum": -3,
"maximum": 3
},
"ratio": {
"type": [
"number",
"null"
]
},
"axis": {
"enum": [
"horizontal",
"vertical"
]
},
"edge": {
"enum": [
"left",
"horizontal-center",
"right",
"top",
"vertical-center",
"bottom"
]
},
"reference": {
"enum": [
"canvas",
"selection",
"key-layer"
]
},
"keyLayerId": {
"type": [
"string",
"null"
]
},
"transform": {
"type": "object"
},
"crop": {
"type": "object"
}
},
"required": [
"projectId",
"operation"
]
}
Similar websites
reloadium.com
Paste a topic, URL, or PDF/TXT/MD — get a multi-episode AI podcast with audio, transcripts, timelines and quizzes. 60+ languages.
api.lmm.best
Connect AI models, tools and applications with LMM Forge. Explore model access, developer guides and open-source collaboration.
deskintab.dgkhan08.workers.dev
An operating system in your browser, where you and your AI agent share apps, files, and projects through WebMCP.
webmcp.agentsdesk.dev
Meridian Ops