Skip to main content
Glama

Edit Design

perform-editing-operations

Apply one or more draft changes to the content or layout of an existing Canva design within an active editing transaction.

Use to revise, rewrite, or translate text; replace, insert, position, or resize images and videos on a page; remove page elements; edit text formatting; update a design title; or label fixed-page elements.

Not for changing a design's page structure or order.

Changes are temporary until saved. Show the user a preview of their changes and obtain explicit approval before saving changes.

Returns the updated page state for further changes, previewing, saving, or discarding.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pagesNoThe list of all pages in the design. This must be the `pages` array returned by the last call to `perform-editing-operations` or if this is the first call the `start-editing-transaction` tool. Used to determine which pages are responsive and editable.
operationsYesThe editing operations to perform on the design in this editing transaction. Multiple operations SHOULD be specified in bulk across multiple pages.
page_indexYesRequired page index of the first page that is going to be updated as part of this update. Multiple operations SHOULD be specified in bulk across multiple pages, this just needs to specify the first page in the set of pages to be updated. Pages are indexed using one-based numbering, so the first page in a design has the index value `1`.
user_intentNoMandatory description of what the user is trying to accomplish with this tool call. This should always be provided by LLM clients. Please keep it concise (255 characters or less recommended).
transaction_idYesThe editing transaction ID. This must be the exact `transaction_id` value returned in the `start-editing-transaction` tool response for the editing transaction to perform editing operations on.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / operations / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "title": {
      -        "description": "The new title for the design",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "update_title",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "title"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the element to replace the text of.",
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "The new text to replace the existing text with.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "replace_text",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alt_text": {
      -        "description": "The alternate text of the new asset",
      -        "type": "string"
      -      },
      -      "asset_id": {
      -        "description": "ID of the asset",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "pattern": "^[a-zA-Z0-9_-]+$",
      -        "type": "string"
      -      },
      -      "asset_type": {
      -        "description": "The type of the new asset",
      -        "enum": [
      -          "image",
      -          "video"
      -        ],
      -        "type": "string"
      -      },
      -      "element_id": {
      -        "description": "The ID of the image or video element whose fill should be replaced.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "update_fill",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id",
      -      "asset_type",
      -      "asset_id",
      -      "alt_text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alt_text": {
      -        "description": "The alternate text of the asset",
      -        "type": "string"
      -      },
      -      "asset_id": {
      -        "description": "ID of the asset",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "pattern": "^[a-zA-Z0-9_-]+$",
      -        "type": "string"
      -      },
      -      "asset_type": {
      -        "description": "The type of the asset to insert",
      -        "enum": [
      -          "image",
      -          "video"
      -        ],
      -        "type": "string"
      -      },
      -      "height": {
      -        "description": "Height in pixels. Must be > 0. If not specified, a default height will be used",
      -        "exclusiveMinimum": 0,
      -        "type": "number"
      -      },
      -      "left": {
      -        "description": "Left position in pixels. If not specified, a default position will be used",
      -        "type": "number"
      -      },
      -      "opacity": {
      -        "description": "Opacity value. Range: [0, 1], default: 1",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "page_id": {
      -        "description": "The ID of the page to insert the fill into",
      -        "type": "string"
      -      },
      -      "rotation": {
      -        "description": "Rotation in degrees. Range: [-180.0, 180.0], default: 0",
      -        "maximum": 180,
      -        "minimum": -180,
      -        "type": "number"
      -      },
      -      "top": {
      -        "description": "Top position in pixels. If not specified, a default position will be used",
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "insert_fill",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "Width in pixels. Must be > 0. If not specified, a default width will be used",
      -        "exclusiveMinimum": 0,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "page_id",
      -      "asset_type",
      -      "asset_id",
      -      "alt_text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the element to delete.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "delete_element",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the element to find and replace the text in.",
      -        "type": "string"
      -      },
      -      "find_text": {
      -        "description": "The text that is needs to be found to be replaced.",
      -        "type": "string"
      -      },
      -      "replace_text": {
      -        "description": "The new text to replace the existing text with.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "find_and_replace_text",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id",
      -      "find_text",
      -      "replace_text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the element to reposition.",
      -        "type": "string"
      -      },
      -      "left": {
      -        "description": "Left position in pixels (relative to page).",
      -        "type": "number"
      -      },
      -      "top": {
      -        "description": "Top position in pixels (relative to page).",
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "position_element",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id",
      -      "top",
      -      "left"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Resizes an existing element (image, video, text, etc.) to a new size on the page. IMPORTANT: For TEXT elements, only specify width (height is auto-calculated). For IMAGE/VIDEO elements: if preserve_aspect_ratio=true, specify ONLY width OR height (the other is calculated); if preserve_aspect_ratio=false, specify both width and height.",
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the element to resize.",
      -        "type": "string"
      -      },
      -      "height": {
      -        "description": "The height in pixels of the element. For TEXT elements: do NOT provide height - it will be automatically calculated. For other elements: if preserve_aspect_ratio is true, provide either width OR height (not both) - the other dimension will be calculated. If preserve_aspect_ratio is false, provide both width and height.",
      -        "type": "number"
      -      },
      -      "preserve_aspect_ratio": {
      -        "default": false,
      -        "description": "Whether to preserve the aspect ratio of the element. If true, provide only ONE dimension (width or height) - the other will be calculated automatically. If false, provide both dimensions.",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "resize_element",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "The width in pixels of the element. Required unless preserve_aspect_ratio is true and height is provided.",
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the text element to format.",
      -        "type": "string"
      -      },
      -      "formatting": {
      -        "additionalProperties": false,
      -        "description": "The formatting options to apply to the text",
      -        "properties": {
      -          "color": {
      -            "description": "Text color in hex format",
      -            "pattern": "^#[0-9A-Fa-f]{6}$",
      -            "type": "string"
      -          },
      -          "decoration": {
      -            "description": "Text decoration: none or underline",
      -            "enum": [
      -              "none",
      -              "underline"
      -            ],
      -            "type": "string"
      -          },
      -          "font_size": {
      -            "description": "The size of text in pixels. Must be between 1 and 800",
      -            "maximum": 800,
      -            "minimum": 1,
      -            "type": "integer"
      -          },
      -          "font_style": {
      -            "description": "Font style: normal or italic",
      -            "enum": [
      -              "normal",
      -              "italic"
      -            ],
      -            "type": "string"
      -          },
      -          "font_weight": {
      -            "description": "Font weight: normal or bold",
      -            "enum": [
      -              "normal",
      -              "bold"
      -            ],
      -            "type": "string"
      -          },
      -          "line_height": {
      -            "description": "Line height multiplier. Range: [0.5, 2.5]",
      -            "maximum": 2.5,
      -            "minimum": 0.5,
      -            "type": "number"
      -          },
      -          "link": {
      -            "anyOf": [
      -              {
      -                "const": "",
      -                "type": "string"
      -              },
      -              {
      -                "format": "uri",
      -                "type": "string"
      -              }
      -            ],
      -            "description": "URL string. Setting to empty string removes any existing link"
      -          },
      -          "list_level": {
      -            "description": "List nesting level. 0 removes list formatting (not a list item). 1 is the outermost level, with higher values (e.g., 2, 3, etc.) increasing the nesting depth.",
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "list_marker": {
      -            "description": "List marker style (only applies when list_level > 0): none, disc, circle, square, decimal, lower-alpha, or lower-roman",
      -            "enum": [
      -              "none",
      -              "disc",
      -              "circle",
      -              "square",
      -              "decimal",
      -              "lower-alpha",
      -              "lower-roman"
      -            ],
      -            "type": "string"
      -          },
      -          "strikethrough": {
      -            "description": "Strikethrough style: none or strikethrough",
      -            "enum": [
      -              "none",
      -              "strikethrough"
      -            ],
      -            "type": "string"
      -          },
      -          "text_align": {
      -            "description": "Text alignment: start, center, or end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "format_text",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id",
      -      "formatting"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Connects or removes an autofill field label on a text or image element. This is only supported on fixed-page designs.",
      -    "properties": {
      -      "autofill_field_label": {
      -        "description": "The autofill field label to connect to the element. Omit this property to remove an existing autofill field mapping.",
      -        "type": "string"
      -      },
      -      "element_id": {
      -        "description": "The ID of the text or image element to connect to an autofill field.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "update_autofill_field",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "title": {
      +        "description": "The new title for the design",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "update_title",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "title"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the element to replace the text of.",
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "The new text to replace the existing text with.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "replace_text",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alt_text": {
      +        "description": "The alternate text of the new asset",
      +        "maxLength": 250,
      +        "type": "string"
      +      },
      +      "asset_id": {
      +        "description": "ID of the asset",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "pattern": "^[a-zA-Z0-9_-]+$",
      +        "type": "string"
      +      },
      +      "asset_type": {
      +        "description": "The type of the new asset",
      +        "enum": [
      +          "image",
      +          "video"
      +        ],
      +        "type": "string"
      +      },
      +      "element_id": {
      +        "description": "The ID of the image or video element whose fill should be replaced.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "update_fill",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id",
      +      "asset_type",
      +      "asset_id",
      +      "alt_text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alt_text": {
      +        "description": "The alternate text of the asset",
      +        "maxLength": 250,
      +        "type": "string"
      +      },
      +      "asset_id": {
      +        "description": "ID of the asset",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "pattern": "^[a-zA-Z0-9_-]+$",
      +        "type": "string"
      +      },
      +      "asset_type": {
      +        "description": "The type of the asset to insert",
      +        "enum": [
      +          "image",
      +          "video"
      +        ],
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "Height in pixels. Must be > 0. If not specified, a default height will be used",
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "left": {
      +        "description": "Left position in pixels. If not specified, a default position will be used",
      +        "type": "number"
      +      },
      +      "opacity": {
      +        "description": "Opacity value. Range: [0, 1], default: 1",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "page_id": {
      +        "description": "The ID of the page to insert the fill into",
      +        "type": "string"
      +      },
      +      "rotation": {
      +        "description": "Rotation in degrees. Range: [-180.0, 180.0], default: 0",
      +        "maximum": 180,
      +        "minimum": -180,
      +        "type": "number"
      +      },
      +      "top": {
      +        "description": "Top position in pixels. If not specified, a default position will be used",
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "insert_fill",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "Width in pixels. Must be > 0. If not specified, a default width will be used",
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "page_id",
      +      "asset_type",
      +      "asset_id",
      +      "alt_text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the element to delete.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "delete_element",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the element to find and replace the text in.",
      +        "type": "string"
      +      },
      +      "find_text": {
      +        "description": "The text that is needs to be found to be replaced.",
      +        "type": "string"
      +      },
      +      "replace_text": {
      +        "description": "The new text to replace the existing text with.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "find_and_replace_text",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id",
      +      "find_text",
      +      "replace_text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the element to reposition.",
      +        "type": "string"
      +      },
      +      "left": {
      +        "description": "Left position in pixels (relative to page).",
      +        "type": "number"
      +      },
      +      "top": {
      +        "description": "Top position in pixels (relative to page).",
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "position_element",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id",
      +      "top",
      +      "left"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Resizes an existing element (image, video, text, etc.) to a new size on the page. IMPORTANT: For TEXT elements, only specify width (height is auto-calculated). For IMAGE/VIDEO elements: if preserve_aspect_ratio=true, specify ONLY width OR height (the other is calculated); if preserve_aspect_ratio=false, specify both width and height.",
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the element to resize.",
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "The height in pixels of the element. For TEXT elements: do NOT provide height - it will be automatically calculated. For other elements: if preserve_aspect_ratio is true, provide either width OR height (not both) - the other dimension will be calculated. If preserve_aspect_ratio is false, provide both width and height.",
      +        "type": "number"
      +      },
      +      "preserve_aspect_ratio": {
      +        "default": false,
      +        "description": "Whether to preserve the aspect ratio of the element. If true, provide only ONE dimension (width or height) - the other will be calculated automatically. If false, provide both dimensions.",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "resize_element",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "The width in pixels of the element. Required unless preserve_aspect_ratio is true and height is provided.",
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the text element to format.",
      +        "type": "string"
      +      },
      +      "formatting": {
      +        "additionalProperties": false,
      +        "description": "The formatting options to apply to the text",
      +        "properties": {
      +          "color": {
      +            "description": "Text color in hex format",
      +            "pattern": "^#[0-9A-Fa-f]{6}$",
      +            "type": "string"
      +          },
      +          "decoration": {
      +            "description": "Text decoration: none or underline",
      +            "enum": [
      +              "none",
      +              "underline"
      +            ],
      +            "type": "string"
      +          },
      +          "font_size": {
      +            "description": "The size of text in pixels. Must be between 1 and 800",
      +            "maximum": 800,
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "font_style": {
      +            "description": "Font style: normal or italic",
      +            "enum": [
      +              "normal",
      +              "italic"
      +            ],
      +            "type": "string"
      +          },
      +          "font_weight": {
      +            "description": "Font weight: normal or bold",
      +            "enum": [
      +              "normal",
      +              "bold"
      +            ],
      +            "type": "string"
      +          },
      +          "line_height": {
      +            "description": "Line height multiplier. Range: [0.5, 2.5]",
      +            "maximum": 2.5,
      +            "minimum": 0.5,
      +            "type": "number"
      +          },
      +          "link": {
      +            "anyOf": [
      +              {
      +                "const": "",
      +                "type": "string"
      +              },
      +              {
      +                "format": "uri",
      +                "type": "string"
      +              }
      +            ],
      +            "description": "URL string. Setting to empty string removes any existing link"
      +          },
      +          "list_level": {
      +            "description": "List nesting level. 0 removes list formatting (not a list item). 1 is the outermost level, with higher values (e.g., 2, 3, etc.) increasing the nesting depth.",
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "list_marker": {
      +            "description": "List marker style (only applies when list_level > 0): none, disc, circle, square, decimal, lower-alpha, or lower-roman",
      +            "enum": [
      +              "none",
      +              "disc",
      +              "circle",
      +              "square",
      +              "decimal",
      +              "lower-alpha",
      +              "lower-roman"
      +            ],
      +            "type": "string"
      +          },
      +          "strikethrough": {
      +            "description": "Strikethrough style: none or strikethrough",
      +            "enum": [
      +              "none",
      +              "strikethrough"
      +            ],
      +            "type": "string"
      +          },
      +          "text_align": {
      +            "description": "Text alignment: start, center, or end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "format_text",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id",
      +      "formatting"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Connects or removes an autofill field label on a text or image element. This is only supported on fixed-page designs.",
      +    "properties": {
      +      "autofill_field_label": {
      +        "description": "The autofill field label to connect to the element. Omit this property to remove an existing autofill field mapping.",
      +        "type": "string"
      +      },
      +      "element_id": {
      +        "description": "The ID of the text or image element to connect to an autofill field.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "update_autofill_field",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / operations / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "title": {
      -        "description": "The new title for the design",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "update_title",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "title"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the element to replace the text of.",
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "The new text to replace the existing text with.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "replace_text",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alt_text": {
      -        "description": "The alternate text of the new asset",
      -        "type": "string"
      -      },
      -      "asset_id": {
      -        "description": "ID of the asset",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "pattern": "^[a-zA-Z0-9_-]+$",
      -        "type": "string"
      -      },
      -      "asset_type": {
      -        "description": "The type of the new asset",
      -        "enum": [
      -          "image",
      -          "video"
      -        ],
      -        "type": "string"
      -      },
      -      "element_id": {
      -        "description": "The ID of the element to replace the text of.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "update_fill",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id",
      -      "asset_type",
      -      "asset_id",
      -      "alt_text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alt_text": {
      -        "description": "The alternate text of the asset",
      -        "type": "string"
      -      },
      -      "asset_id": {
      -        "description": "ID of the asset",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "pattern": "^[a-zA-Z0-9_-]+$",
      -        "type": "string"
      -      },
      -      "asset_type": {
      -        "description": "The type of the asset to insert",
      -        "enum": [
      -          "image",
      -          "video"
      -        ],
      -        "type": "string"
      -      },
      -      "height": {
      -        "description": "Height in pixels. Must be > 0. If not specified, a default height will be used",
      -        "exclusiveMinimum": 0,
      -        "type": "number"
      -      },
      -      "left": {
      -        "description": "Left position in pixels. If not specified, a default position will be used",
      -        "type": "number"
      -      },
      -      "opacity": {
      -        "description": "Opacity value. Range: [0, 1], default: 1",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "page_id": {
      -        "description": "The ID of the page to insert the fill into",
      -        "type": "string"
      -      },
      -      "rotation": {
      -        "description": "Rotation in degrees. Range: [-180.0, 180.0], default: 0",
      -        "maximum": 180,
      -        "minimum": -180,
      -        "type": "number"
      -      },
      -      "top": {
      -        "description": "Top position in pixels. If not specified, a default position will be used",
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "insert_fill",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "Width in pixels. Must be > 0. If not specified, a default width will be used",
      -        "exclusiveMinimum": 0,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "page_id",
      -      "asset_type",
      -      "asset_id",
      -      "alt_text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the element to delete.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "delete_element",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the element to find and replace the text in.",
      -        "type": "string"
      -      },
      -      "find_text": {
      -        "description": "The text that is needs to be found to be replaced.",
      -        "type": "string"
      -      },
      -      "replace_text": {
      -        "description": "The new text to replace the existing text with.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "find_and_replace_text",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id",
      -      "find_text",
      -      "replace_text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the element to reposition.",
      -        "type": "string"
      -      },
      -      "left": {
      -        "description": "Left position in pixels (relative to page).",
      -        "type": "number"
      -      },
      -      "top": {
      -        "description": "Top position in pixels (relative to page).",
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "position_element",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id",
      -      "top",
      -      "left"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Resizes an existing element (image, video, text, etc.) to a new size on the page. IMPORTANT: For TEXT elements, only specify width (height is auto-calculated). For IMAGE/VIDEO elements: if preserve_aspect_ratio=true, specify ONLY width OR height (the other is calculated); if preserve_aspect_ratio=false, specify both width and height.",
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the element to resize.",
      -        "type": "string"
      -      },
      -      "height": {
      -        "description": "The height in pixels of the element. For TEXT elements: do NOT provide height - it will be automatically calculated. For other elements: if preserve_aspect_ratio is true, provide either width OR height (not both) - the other dimension will be calculated. If preserve_aspect_ratio is false, provide both width and height.",
      -        "type": "number"
      -      },
      -      "preserve_aspect_ratio": {
      -        "default": false,
      -        "description": "Whether to preserve the aspect ratio of the element. If true, provide only ONE dimension (width or height) - the other will be calculated automatically. If false, provide both dimensions.",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "resize_element",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "The width in pixels of the element. Required unless preserve_aspect_ratio is true and height is provided.",
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "element_id": {
      -        "description": "The ID of the text element to format.",
      -        "type": "string"
      -      },
      -      "formatting": {
      -        "additionalProperties": false,
      -        "description": "The formatting options to apply to the text",
      -        "properties": {
      -          "color": {
      -            "description": "Text color in hex format",
      -            "pattern": "^#[0-9A-Fa-f]{6}$",
      -            "type": "string"
      -          },
      -          "decoration": {
      -            "description": "Text decoration: none or underline",
      -            "enum": [
      -              "none",
      -              "underline"
      -            ],
      -            "type": "string"
      -          },
      -          "font_size": {
      -            "description": "The size of text in pixels. Must be between 1 and 800",
      -            "maximum": 800,
      -            "minimum": 1,
      -            "type": "integer"
      -          },
      -          "font_style": {
      -            "description": "Font style: normal or italic",
      -            "enum": [
      -              "normal",
      -              "italic"
      -            ],
      -            "type": "string"
      -          },
      -          "font_weight": {
      -            "description": "Font weight: normal or bold",
      -            "enum": [
      -              "normal",
      -              "bold"
      -            ],
      -            "type": "string"
      -          },
      -          "line_height": {
      -            "description": "Line height multiplier. Range: [0.5, 2.5]",
      -            "maximum": 2.5,
      -            "minimum": 0.5,
      -            "type": "number"
      -          },
      -          "link": {
      -            "anyOf": [
      -              {
      -                "const": "",
      -                "type": "string"
      -              },
      -              {
      -                "format": "uri",
      -                "type": "string"
      -              }
      -            ],
      -            "description": "URL string. Setting to empty string removes any existing link"
      -          },
      -          "list_level": {
      -            "description": "List nesting level. 0 removes list formatting (not a list item). 1 is the outermost level, with higher values (e.g., 2, 3, etc.) increasing the nesting depth.",
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "list_marker": {
      -            "description": "List marker style (only applies when list_level > 0): none, disc, circle, square, decimal, lower-alpha, or lower-roman",
      -            "enum": [
      -              "none",
      -              "disc",
      -              "circle",
      -              "square",
      -              "decimal",
      -              "lower-alpha",
      -              "lower-roman"
      -            ],
      -            "type": "string"
      -          },
      -          "strikethrough": {
      -            "description": "Strikethrough style: none or strikethrough",
      -            "enum": [
      -              "none",
      -              "strikethrough"
      -            ],
      -            "type": "string"
      -          },
      -          "text_align": {
      -            "description": "Text alignment: start, center, or end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "format_text",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id",
      -      "formatting"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Connects or removes an autofill field label on a text or image element. This is only supported on fixed-page designs.",
      -    "properties": {
      -      "autofill_field_label": {
      -        "description": "The autofill field label to connect to the element. Omit this property to remove an existing autofill field mapping.",
      -        "type": "string"
      -      },
      -      "element_id": {
      -        "description": "The ID of the text or image element to connect to an autofill field.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "update_autofill_field",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "element_id"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "title": {
      +        "description": "The new title for the design",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "update_title",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "title"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the element to replace the text of.",
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "The new text to replace the existing text with.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "replace_text",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alt_text": {
      +        "description": "The alternate text of the new asset",
      +        "type": "string"
      +      },
      +      "asset_id": {
      +        "description": "ID of the asset",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "pattern": "^[a-zA-Z0-9_-]+$",
      +        "type": "string"
      +      },
      +      "asset_type": {
      +        "description": "The type of the new asset",
      +        "enum": [
      +          "image",
      +          "video"
      +        ],
      +        "type": "string"
      +      },
      +      "element_id": {
      +        "description": "The ID of the image or video element whose fill should be replaced.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "update_fill",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id",
      +      "asset_type",
      +      "asset_id",
      +      "alt_text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alt_text": {
      +        "description": "The alternate text of the asset",
      +        "type": "string"
      +      },
      +      "asset_id": {
      +        "description": "ID of the asset",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "pattern": "^[a-zA-Z0-9_-]+$",
      +        "type": "string"
      +      },
      +      "asset_type": {
      +        "description": "The type of the asset to insert",
      +        "enum": [
      +          "image",
      +          "video"
      +        ],
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "Height in pixels. Must be > 0. If not specified, a default height will be used",
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "left": {
      +        "description": "Left position in pixels. If not specified, a default position will be used",
      +        "type": "number"
      +      },
      +      "opacity": {
      +        "description": "Opacity value. Range: [0, 1], default: 1",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "page_id": {
      +        "description": "The ID of the page to insert the fill into",
      +        "type": "string"
      +      },
      +      "rotation": {
      +        "description": "Rotation in degrees. Range: [-180.0, 180.0], default: 0",
      +        "maximum": 180,
      +        "minimum": -180,
      +        "type": "number"
      +      },
      +      "top": {
      +        "description": "Top position in pixels. If not specified, a default position will be used",
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "insert_fill",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "Width in pixels. Must be > 0. If not specified, a default width will be used",
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "page_id",
      +      "asset_type",
      +      "asset_id",
      +      "alt_text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the element to delete.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "delete_element",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the element to find and replace the text in.",
      +        "type": "string"
      +      },
      +      "find_text": {
      +        "description": "The text that is needs to be found to be replaced.",
      +        "type": "string"
      +      },
      +      "replace_text": {
      +        "description": "The new text to replace the existing text with.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "find_and_replace_text",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id",
      +      "find_text",
      +      "replace_text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the element to reposition.",
      +        "type": "string"
      +      },
      +      "left": {
      +        "description": "Left position in pixels (relative to page).",
      +        "type": "number"
      +      },
      +      "top": {
      +        "description": "Top position in pixels (relative to page).",
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "position_element",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id",
      +      "top",
      +      "left"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Resizes an existing element (image, video, text, etc.) to a new size on the page. IMPORTANT: For TEXT elements, only specify width (height is auto-calculated). For IMAGE/VIDEO elements: if preserve_aspect_ratio=true, specify ONLY width OR height (the other is calculated); if preserve_aspect_ratio=false, specify both width and height.",
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the element to resize.",
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "The height in pixels of the element. For TEXT elements: do NOT provide height - it will be automatically calculated. For other elements: if preserve_aspect_ratio is true, provide either width OR height (not both) - the other dimension will be calculated. If preserve_aspect_ratio is false, provide both width and height.",
      +        "type": "number"
      +      },
      +      "preserve_aspect_ratio": {
      +        "default": false,
      +        "description": "Whether to preserve the aspect ratio of the element. If true, provide only ONE dimension (width or height) - the other will be calculated automatically. If false, provide both dimensions.",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "resize_element",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "The width in pixels of the element. Required unless preserve_aspect_ratio is true and height is provided.",
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "element_id": {
      +        "description": "The ID of the text element to format.",
      +        "type": "string"
      +      },
      +      "formatting": {
      +        "additionalProperties": false,
      +        "description": "The formatting options to apply to the text",
      +        "properties": {
      +          "color": {
      +            "description": "Text color in hex format",
      +            "pattern": "^#[0-9A-Fa-f]{6}$",
      +            "type": "string"
      +          },
      +          "decoration": {
      +            "description": "Text decoration: none or underline",
      +            "enum": [
      +              "none",
      +              "underline"
      +            ],
      +            "type": "string"
      +          },
      +          "font_size": {
      +            "description": "The size of text in pixels. Must be between 1 and 800",
      +            "maximum": 800,
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "font_style": {
      +            "description": "Font style: normal or italic",
      +            "enum": [
      +              "normal",
      +              "italic"
      +            ],
      +            "type": "string"
      +          },
      +          "font_weight": {
      +            "description": "Font weight: normal or bold",
      +            "enum": [
      +              "normal",
      +              "bold"
      +            ],
      +            "type": "string"
      +          },
      +          "line_height": {
      +            "description": "Line height multiplier. Range: [0.5, 2.5]",
      +            "maximum": 2.5,
      +            "minimum": 0.5,
      +            "type": "number"
      +          },
      +          "link": {
      +            "anyOf": [
      +              {
      +                "const": "",
      +                "type": "string"
      +              },
      +              {
      +                "format": "uri",
      +                "type": "string"
      +              }
      +            ],
      +            "description": "URL string. Setting to empty string removes any existing link"
      +          },
      +          "list_level": {
      +            "description": "List nesting level. 0 removes list formatting (not a list item). 1 is the outermost level, with higher values (e.g., 2, 3, etc.) increasing the nesting depth.",
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "list_marker": {
      +            "description": "List marker style (only applies when list_level > 0): none, disc, circle, square, decimal, lower-alpha, or lower-roman",
      +            "enum": [
      +              "none",
      +              "disc",
      +              "circle",
      +              "square",
      +              "decimal",
      +              "lower-alpha",
      +              "lower-roman"
      +            ],
      +            "type": "string"
      +          },
      +          "strikethrough": {
      +            "description": "Strikethrough style: none or strikethrough",
      +            "enum": [
      +              "none",
      +              "strikethrough"
      +            ],
      +            "type": "string"
      +          },
      +          "text_align": {
      +            "description": "Text alignment: start, center, or end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "format_text",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id",
      +      "formatting"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Connects or removes an autofill field label on a text or image element. This is only supported on fixed-page designs.",
      +    "properties": {
      +      "autofill_field_label": {
      +        "description": "The autofill field label to connect to the element. Omit this property to remove an existing autofill field mapping.",
      +        "type": "string"
      +      },
      +      "element_id": {
      +        "description": "The ID of the text or image element to connect to an autofill field.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "update_autofill_field",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "element_id"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. First observed

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, and the description adds real context beyond them: changes are provisional until saved, the user must preview and explicitly approve, and the return value is the updated page state for further operations. It does not state transaction expiry or ordering semantics, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, followed by use cases, exclusions, and lifecycle notes in short scannable sentences. Slightly longer than strictly necessary but every sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex multi-operation mutation tool with no output schema, the description covers the transaction context, the approval guardrail, and the return value ('updated page state'). It omits how operations are ordered and how errors in a mixed batch are reported, which an agent would benefit from knowing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 transaction_id, page_index, pages, operations, and user_intent in detail. The description adds no syntax or format detail beyond the schema, so the baseline of 3 applies.

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 specific verb ('Apply one or more draft changes') against a specific resource ('an existing Canva design') and enumerates the concrete operation families (text, images/videos, page elements, formatting, title, fixed-page labels). It also explicitly excludes page structure/order edits, which cleanly separates it from resize-design and start-editing-transaction.

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?

The second sentence lists the when-to-use cases exhaustively and the third names an explicit when-NOT case ('Not for changing a design's page structure or order'). It also states the workflow context ('within an active editing transaction') and the required approval step before saving, so an agent knows the preconditions and the guardrail.

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