Skip to main content
Glama

add_adjustment

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).

Input Schema

NameRequiredDescriptionDefault
hueNohue_saturation only. Degrees. Default (when creating): 0.
maskNoName 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.
nameNoLabel for a new filter, e.g. "Lift shadows". Made unique automatically.
typeYesWhich 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.
gammaNolevels only. Midtone gamma, 0.1..10 — >1 brightens midtones, <1 darkens. Default (when creating): 1.0.
imageYesImage id, as returned by open_photo.
layerNoLayer 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.
rangeNohue_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.
scaleNosaturation only. 1.0 = unchanged. Default (when creating): 1.0.
amountNosharpen 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_lowNolevels only. Input black point; must stay below in_high (an empty or inverted input range is refused). Default (when creating): 0.
pointsNocurves 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.
radiusNoshadows_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).
channelNocurves/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_highNolevels only. Input white point; must stay above in_low. Default (when creating): 255.
out_lowNolevels only. Output black. Default (when creating): 0.
shadowsNoshadows_highlights only. Default (when creating): 0.
compressNoshadows_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.
contrastNobrightness_contrast only. Default (when creating): 0.
cyan_redNocolor_balance only. Default (when creating): 0.
exposureNoexposure only. Stops. Default (when creating): 0.
layer_idNoLayer 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_highNolevels only. Output white. Default (when creating): 255.
strengthNonoise_reduction only. Neighbourhood size. Default (when creating): 4.
vibranceNovibrance 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_idNoRe-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.
lightnessNohue_saturation only. Default (when creating): 0.
thresholdNosharpen only. Default (when creating): 0.
to_kelvinNocolor_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.
brightnessNobrightness_contrast only. Default (when creating): 0.
highlightsNoshadows_highlights only. Default (when creating): 0.
saturationNohue_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.
whitepointNoshadows_highlights only. Shifts the white point: positive brightens the top end, negative pulls it down. Default (when creating): 0.
black_levelNoexposure only. Shadow black-point shift. Default (when creating): 0.0.
from_kelvinNocolor_temperature only. The temperature the photo currently looks shot under. Default (when creating): 6500.
yellow_blueNocolor_balance only. Default (when creating): 0.
magenta_greenNocolor_balance only. Default (when creating): 0.
shadows_ccorrectNoshadows_highlights only. Colour saturation kept in the lifted shadows (0 = none, 100 = full). Default (when creating): 100.
highlights_ccorrectNoshadows_highlights only. Colour saturation kept in the recovered highlights (0 = none, 100 = full). Default (when creating): 50.
preserve_luminosityNocolor_balance only. Default (when creating): true.

Output Schema

NameRequiredDescriptionDefault
maskNo
nameNo
typeNo
filter_idNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / vibrance / description
      Previous 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."
  2. First observed

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources