← Back to Google Slides docs

Google Slides — Tool Reference

Create and edit Google Slides

30 tools · auto-generated from the deployed toolkit

Your AI assistant discovers and invokes these tools through the MCP Server's meta tools — it calls execute_tool with the tool name and arguments below.

# add_image write

Add an image to a slide from a public URL or encoded bytes and return the inserted image element details.

Full description
Add an image to a slide from a public URL or encoded image data.

Inserts an image onto the specified slide. Provide either:
- image_url: a publicly accessible URL (https:// works best)
- image_data + media_type: encoded image bytes with MIME type

Set image_encoding to control how image_data is decoded:
- "hex" (default, recommended): hexadecimal encoding (e.g. "89504e47...").
  Strongly recommended for chatbot/LLM callers — base64 strings often
  trigger API-key or credential content filters in message pipelines.
- "base64": standard base64 encoding

When using image_data, the image is temporarily uploaded to S3 with a
presigned URL, inserted via the Google Slides API, then auto-expired
by a lifecycle rule.

The image is placed at the specified position and size. If the aspect
ratio of the provided dimensions differs from the image's natural
aspect ratio, the image may appear stretched or compressed.

Position and size are specified in EMU (English Metric Units).
1 inch = 914400 EMU.

Limits:
- image_data: max 1 MB decoded
- Allowed media_type: image/png, image/jpeg, image/gif, image/webp
- width: max 9144000 EMU (10 inches)
- height: max 6858000 EMU (7.5 inches)

Args:
    presentation_id: ID of the presentation
    slide_id: ID of the slide to add the image to
    image_url: Public URL of the image (mutually exclusive with image_data)
    image_data: Encoded image bytes (mutually exclusive with image_url)
    image_encoding: Encoding format — 'hex' (default, recommended) or 'base64'
    media_type: MIME type when using image_data (e.g. 'image/png', 'image/jpeg')
    x: X position in EMU
    y: Y position in EMU
    width: Width of the image in EMU (max 9144000 / 10 inches)
    height: Height of the image in EMU (max 6858000 / 7.5 inches)

Returns:
    Status, element ID of the created image, source URL, and image source type.

Example: {"presentation_id": "abc123", "slide_id": "p2", "image_url": "https://example.com/logo.png", "x": 457200, "y": 457200, "width": 2743200, "height": 2743200}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
slide_id string Yes ID of the slide to add the image to
image_url string | null No Public URL of the image (mutually exclusive with image_data)
image_data string | null No Encoded image bytes (mutually exclusive with image_url). Hex encoding is strongly recommended for chatbot/LLM callers to avoid content-filter false positives on base64 strings.
image_encoding string | null No Encoding of image_data: 'hex' (default, recommended) or 'base64' Default: "hex"
media_type string | null No MIME type when using image_data, e.g. 'image/png', 'image/jpeg'
x number Yes X position in EMU (1 inch = 914400 EMU)
y number Yes Y position in EMU
width number Yes Width of the image in EMU
height number Yes Height of the image in EMU
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for adding an image to a slide",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the slide to add the image to",
      "title": "Slide Id",
      "type": "string"
    },
    "image_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Public URL of the image (mutually exclusive with image_data)",
      "title": "Image Url"
    },
    "image_data": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Encoded image bytes (mutually exclusive with image_url). Hex encoding is strongly recommended for chatbot/LLM callers to avoid content-filter false positives on base64 strings.",
      "title": "Image Data"
    },
    "image_encoding": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": "hex",
      "description": "Encoding of image_data: 'hex' (default, recommended) or 'base64'",
      "title": "Image Encoding"
    },
    "media_type": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "MIME type when using image_data, e.g. 'image/png', 'image/jpeg'",
      "title": "Media Type"
    },
    "x": {
      "description": "X position in EMU (1 inch = 914400 EMU)",
      "title": "X",
      "type": "number"
    },
    "y": {
      "description": "Y position in EMU",
      "title": "Y",
      "type": "number"
    },
    "width": {
      "description": "Width of the image in EMU",
      "title": "Width",
      "type": "number"
    },
    "height": {
      "description": "Height of the image in EMU",
      "title": "Height",
      "type": "number"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "slide_id",
    "x",
    "y",
    "width",
    "height"
  ],
  "title": "AddImageParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of adding an image",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the created image element",
      "title": "Element Id",
      "type": "string"
    },
    "image_url": {
      "description": "Image URL used (presigned URL or original URL)",
      "title": "Image Url",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    },
    "image_source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "'url', 'base64', or 'hex' — how the image was provided",
      "title": "Image Source"
    }
  },
  "required": [
    "status",
    "element_id",
    "image_url",
    "message"
  ],
  "title": "AddImageResult",
  "type": "object"
}

# add_slide write

Add a new slide with a chosen layout and return the created slide's ID and position.

Full description
Add a new slide to the presentation.

Specify the layout using one of two methods:

**layout_id (recommended):** Use a layout object ID from the presentation's
layouts list (returned by create_presentation and get_presentation_overview).
This works reliably on all presentations, including those created with custom
page dimensions. Example: layout_id="p3" for TITLE_AND_BODY.

**predefined_layout:** Use a predefined layout name. Works on presentations
created without custom dimensions. Available values:
  - "BLANK" -- empty slide
  - "TITLE" -- centered title + subtitle
  - "TITLE_AND_BODY" -- title + content placeholder
  - "TITLE_AND_TWO_COLUMNS" -- title + two side-by-side content areas
  - "TITLE_ONLY" -- title at top, rest is open
  - "SECTION_HEADER" -- large centered section title
  - "ONE_COLUMN_TEXT" -- single column text layout

Returns the slide ID and any placeholder element IDs for immediate content population.

Args:
    presentation_id: ID of the presentation
    position: Optional position (0-based index) to insert the slide
    layout_id: Layout object ID from the presentation's layouts list (recommended)
    predefined_layout: Predefined layout name (works on default presentations)
    strip_placeholders: Delete default placeholder text boxes (default: true).
        Set to false to keep them for manual population.

Returns:
    Status of the operation, ID of the newly created slide, placeholder info, and success message.

Example: {"presentation_id": "abc123", "predefined_layout": "BLANK"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
position integer | null No Optional position (0-based index) to insert the slide
layout_id string | null No Layout object ID to use for the new slide
predefined_layout string | null No Predefined layout name: BLANK, CAPTION_ONLY, TITLE, TITLE_AND_BODY, TITLE_AND_TWO_COLUMNS, TITLE_ONLY, SECTION_HEADER, SECTION_TITLE_AND_DESCRIPTION, ONE_COLUMN_TEXT, MAIN_POINT, BIG_NUMBER
strip_placeholders boolean | null No Delete default placeholder text boxes from the slide (default: true). Set to false to keep placeholders for manual population. Default: true
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for adding a slide",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "position": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional position (0-based index) to insert the slide",
      "title": "Position"
    },
    "layout_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Layout object ID to use for the new slide",
      "title": "Layout Id"
    },
    "predefined_layout": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Predefined layout name: BLANK, CAPTION_ONLY, TITLE, TITLE_AND_BODY, TITLE_AND_TWO_COLUMNS, TITLE_ONLY, SECTION_HEADER, SECTION_TITLE_AND_DESCRIPTION, ONE_COLUMN_TEXT, MAIN_POINT, BIG_NUMBER",
      "title": "Predefined Layout"
    },
    "strip_placeholders": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": true,
      "description": "Delete default placeholder text boxes from the slide (default: true). Set to false to keep placeholders for manual population.",
      "title": "Strip Placeholders"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id"
  ],
  "title": "AddSlideParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of adding a slide",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the newly created slide",
      "title": "Slide Id",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    },
    "placeholders": {
      "description": "List of placeholder elements with type, objectId, and index",
      "items": {
        "additionalProperties": true,
        "type": "object"
      },
      "title": "Placeholders",
      "type": "array"
    }
  },
  "required": [
    "status",
    "slide_id",
    "message"
  ],
  "title": "AddSlideResult",
  "type": "object"
}

# add_text_box write

Add a text box with styled paragraphs and return the created text element details.

Full description
Add a text box to a slide with one or more styled paragraphs.

For simple text: use a single paragraph with a single run.
For complex text: use multiple paragraphs, each with multiple runs
having different formatting (font, size, color, bold, etc.).

Each paragraph can have its own alignment. Each run within a paragraph
can have unique formatting.

Autofit: When autofit=true, Toolforest measures the text using HarfBuzz
(the same shaping engine Chrome uses) and pre-scales font sizes so the
text fits the box. This is client-side scaling — NOT Google's native
SHAPE_AUTOFIT. The scaled font sizes are written directly, so
get_slide_content_elements will report googleAutofitType=NONE (expected).
The actual scaled sizes are visible in the text runs.

Args:
    presentation_id: ID of the presentation
    slide_id: ID of the slide to add the text box to
    paragraphs: List of paragraph objects, each containing:
        - runs: List of run objects with text and optional styling
          (fontFamily, fontSizePt, bold, italic, textColor, underline)
        - alignment: Optional paragraph alignment (LEFT, CENTER, RIGHT, JUSTIFIED)
    x: X position in EMU
    y: Y position in EMU
    width: Width of the text box in EMU
    height: Height of the text box in EMU
    background_color: Optional hex color for the text box background
    autofit: Enable Toolforest client-side autofit (pre-scales fonts to fit)
    min_font_size_pt: Floor for autofit scaling (default 6pt)

Returns:
    ID of the created text box, plus autofitApplied and scaleFactor
    if autofit was requested.

Example: {"presentation_id": "abc123", "slide_id": "p2", "x": 457200, "y": 274320, "width": 7772400, "height": 914400, "paragraphs": [{"runs": [{"text": "Hello World", "font_size_pt": 24, "bold": true, "text_color": "#FFFFFF"}], "alignment": "CENTER"}]}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
slide_id string Yes ID of the slide to add the text box to
paragraphs array<Paragraph> Yes List of paragraphs with styled runs
x number Yes X position in EMU
y number Yes Y position in EMU
width number Yes Width of the text box in EMU
height number Yes Height of the text box in EMU
background_color string | null No Optional hex color for background
autofit boolean | null No Toolforest client-side autofit (default: on). Pre-scales font sizes at creation time so text fits the box using HarfBuzz measurement. Set to false to disable. This is NOT Google's native SHAPE_AUTOFIT — Google will report autofitType=NONE on read-back because the scaled font sizes are already baked in. Default: true
min_font_size_pt number | null No Minimum font size in points when autofit is enabled. Default: 6pt.
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "$defs": {
    "Paragraph": {
      "description": "A paragraph with runs and optional alignment",
      "properties": {
        "runs": {
          "description": "List of text runs in the paragraph",
          "items": {
            "$ref": "#/$defs/TextRun"
          },
          "title": "Runs",
          "type": "array"
        },
        "alignment": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": "LEFT",
          "description": "Text alignment - LEFT, CENTER, RIGHT, JUSTIFIED",
          "title": "Alignment"
        }
      },
      "required": [
        "runs"
      ],
      "title": "Paragraph",
      "type": "object",
      "additionalProperties": false
    },
    "TextRun": {
      "description": "A run of text with optional styling",
      "properties": {
        "text": {
          "description": "The text content",
          "title": "Text",
          "type": "string"
        },
        "font_family": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Font family name",
          "title": "Font Family"
        },
        "font_size_pt": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Font size in points",
          "title": "Font Size Pt"
        },
        "bold": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether text should be bold",
          "title": "Bold"
        },
        "italic": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether text should be italic",
          "title": "Italic"
        },
        "underline": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether text should be underlined",
          "title": "Underline"
        },
        "text_color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Hex color for text",
          "title": "Text Color"
        }
      },
      "required": [
        "text"
      ],
      "title": "TextRun",
      "type": "object",
      "additionalProperties": false
    }
  },
  "description": "Parameters for adding a text box",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the slide to add the text box to",
      "title": "Slide Id",
      "type": "string"
    },
    "paragraphs": {
      "description": "List of paragraphs with styled runs",
      "items": {
        "$ref": "#/$defs/Paragraph"
      },
      "title": "Paragraphs",
      "type": "array"
    },
    "x": {
      "description": "X position in EMU",
      "title": "X",
      "type": "number"
    },
    "y": {
      "description": "Y position in EMU",
      "title": "Y",
      "type": "number"
    },
    "width": {
      "description": "Width of the text box in EMU",
      "title": "Width",
      "type": "number"
    },
    "height": {
      "description": "Height of the text box in EMU",
      "title": "Height",
      "type": "number"
    },
    "background_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional hex color for background",
      "title": "Background Color"
    },
    "autofit": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": true,
      "description": "Toolforest client-side autofit (default: on). Pre-scales font sizes at creation time so text fits the box using HarfBuzz measurement. Set to false to disable. This is NOT Google's native SHAPE_AUTOFIT — Google will report autofitType=NONE on read-back because the scaled font sizes are already baked in.",
      "title": "Autofit"
    },
    "min_font_size_pt": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Minimum font size in points when autofit is enabled. Default: 6pt.",
      "title": "Min Font Size Pt"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "slide_id",
    "paragraphs",
    "x",
    "y",
    "width",
    "height"
  ],
  "title": "AddTextBoxParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of adding a text box.\n\nWhen autofit is enabled, the response includes fit status:\n- fits=true: text fits within the box (with or without scaling)\n- fits=false, autofitApplied=true: autofit scaled fonts but text still\n  overflows — box too small even at minimum font size\n- fits=false, autofitApplied=false: fonts already at minFontSize, can't\n  scale further. Enlarge box, reduce content, or split across elements.",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "textbox_id": {
      "description": "ID of the created textbox",
      "title": "Textbox Id",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    },
    "autofit_applied": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether Toolforest client-side autofit scaled the text. Note: Google's autofitType will still report NONE because font sizes are pre-scaled.",
      "title": "Autofit Applied"
    },
    "scale_factor": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Toolforest autofit scale factor (1.0 = no change, <1.0 = text was shrunk to fit)",
      "title": "Scale Factor"
    },
    "fits": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether text fits within the box after autofit. False means the box is too small even after scaling to minFontSize — enlarge the box, reduce content, or split.",
      "title": "Fits"
    }
  },
  "required": [
    "status",
    "textbox_id",
    "message"
  ],
  "title": "AddTextBoxResult",
  "type": "object"
}

# check_presentation read

Check all slides in a Google Slides presentation for accessibility and layout issues.

Full description
Check all slides in a presentation for accessibility and layout issues.

Returns a per-slide summary with status (ok/issues) and issue types:
- contrast: text fails WCAG AA contrast ratio against its background
- overflow: text content overflows its container
- out_of_bounds: element extends beyond slide boundaries
- placeholder: leftover empty placeholder element from layout (should have been stripped)

Call get_slide_content_elements on any slide with issues to see full
element details and fix the problems.

Always call this after completing a presentation to validate all slides.

Args:
    presentation_id: The Google Slides presentation ID to check

Returns:
    Per-slide check results with status and issue types, plus a summary

Example: {"presentation_id": "1BxiMVs0XRA5nFMdKvBdBZjgmUii_abc12"}
Parameter Type Required Description
presentation_id string Yes The Google Slides presentation ID to check
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "properties": {
    "presentation_id": {
      "description": "The Google Slides presentation ID to check",
      "title": "Presentation Id",
      "type": "string"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id"
  ],
  "title": "CheckPresentationParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "properties": {
    "presentation_id": {
      "description": "The presentation ID",
      "title": "Presentation Id",
      "type": "string"
    },
    "total_slides": {
      "description": "Total number of slides",
      "title": "Total Slides",
      "type": "integer"
    },
    "slides_with_issues": {
      "description": "Number of slides with issues",
      "title": "Slides With Issues",
      "type": "integer"
    },
    "slides": {
      "description": "Per-slide check results with status and issues",
      "items": {
        "additionalProperties": true,
        "type": "object"
      },
      "title": "Slides",
      "type": "array"
    },
    "summary": {
      "description": "Human-readable summary",
      "title": "Summary",
      "type": "string"
    }
  },
  "required": [
    "presentation_id",
    "total_slides",
    "slides_with_issues",
    "slides",
    "summary"
  ],
  "title": "CheckPresentationResult",
  "type": "object"
}

# create_gradient write

Create a gradient PNG and insert it on a slide as an image for backgrounds, overlays, or decorative fills.

Full description
Create a gradient image and insert it on a slide.

Generates a gradient PNG server-side and inserts it as an image element.
Use this for gradient backgrounds, overlays, or decorative fills — the
Google Slides API does not natively support gradient fills.

Common use cases:
- **Full-slide gradient background**: set position to (0, 0) and size to
  the slide dimensions. Use get_presentation_overview to get the exact
  page dimensions (e.g. 9144000 x 5143500 EMU for widescreen 16:9, or
  9144000 x 6858000 EMU for standard 10" x 7.5").
- **Rectangular gradient fill**: place at any position and size to create
  a gradient-filled rectangle. Works well for cards, banners, or overlays.

Note: the gradient image is always rectangular. It will not clip to
non-rectangular shapes (rounded rectangles, circles, etc.).

Supports 2+ color stops for multi-color gradients. The gradient is rendered
as a small PNG whose aspect ratio matches the requested dimensions,
producing a smooth result without letterboxing.

Direction options:
- "horizontal": left to right
- "vertical": top to bottom
- A numeric angle in degrees (e.g. "45", "135", "270")

Position and size are specified in EMU (English Metric Units).
1 inch = 914400 EMU.

Args:
    presentation_id: ID of the presentation
    slide_id: ID of the slide
    x: X position in EMU
    y: Y position in EMU
    width: Width in EMU (max 9144000 / 10 inches)
    height: Height in EMU (max 6858000 / 7.5 inches)
    direction: "horizontal", "vertical", or angle in degrees
    stops: List of color stops [{position: 0.0-1.0, color: "#RRGGBB"}, ...]

Returns:
    Status, element ID of the created image, and the PNG size in bytes.

Example: {"presentation_id": "abc123", "slide_id": "p2", "x": 0, "y": 0, "width": 9144000, "height": 5143500, "direction": "horizontal", "stops": [{"position": 0.0, "color": "#1A1F36"}, {"position": 1.0, "color": "#3D5AFE"}]}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
slide_id string Yes ID of the slide to add the gradient to
x number Yes X position in EMU (1 inch = 914400 EMU)
y number Yes Y position in EMU
width number Yes Width of the gradient in EMU
height number Yes Height of the gradient in EMU
direction string No Gradient direction: 'horizontal', 'vertical', or angle in degrees (e.g. '45', '135') Default: "horizontal"
stops array<GradientStop> Yes Color stops: [{position: 0.0-1.0, color: '#RRGGBB'}, ...]. At least 2 required.
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "$defs": {
    "GradientStop": {
      "description": "A single color stop in a gradient.",
      "properties": {
        "position": {
          "description": "Position of the stop (0.0 to 1.0)",
          "title": "Position",
          "type": "number"
        },
        "color": {
          "description": "Hex color at this stop (e.g. '#FF6D3A')",
          "title": "Color",
          "type": "string"
        }
      },
      "required": [
        "position",
        "color"
      ],
      "title": "GradientStop",
      "type": "object",
      "additionalProperties": false
    }
  },
  "description": "Parameters for creating a gradient image on a slide.",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the slide to add the gradient to",
      "title": "Slide Id",
      "type": "string"
    },
    "x": {
      "description": "X position in EMU (1 inch = 914400 EMU)",
      "title": "X",
      "type": "number"
    },
    "y": {
      "description": "Y position in EMU",
      "title": "Y",
      "type": "number"
    },
    "width": {
      "description": "Width of the gradient in EMU",
      "title": "Width",
      "type": "number"
    },
    "height": {
      "description": "Height of the gradient in EMU",
      "title": "Height",
      "type": "number"
    },
    "direction": {
      "default": "horizontal",
      "description": "Gradient direction: 'horizontal', 'vertical', or angle in degrees (e.g. '45', '135')",
      "title": "Direction",
      "type": "string"
    },
    "stops": {
      "description": "Color stops: [{position: 0.0-1.0, color: '#RRGGBB'}, ...]. At least 2 required.",
      "items": {
        "$ref": "#/$defs/GradientStop"
      },
      "title": "Stops",
      "type": "array"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "slide_id",
    "x",
    "y",
    "width",
    "height",
    "stops"
  ],
  "title": "CreateGradientParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of creating a gradient image.",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the created image element",
      "title": "Element Id",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    },
    "image_size": {
      "description": "Size of the generated PNG in bytes",
      "title": "Image Size",
      "type": "integer"
    }
  },
  "required": [
    "status",
    "element_id",
    "message",
    "image_size"
  ],
  "title": "CreateGradientResult",
  "type": "object"
}

# create_presentation write

Create a new Google Slides presentation, optionally in Drive folders, and return its metadata and ID.

Full description
Create a new Google Slides presentation.

Creates a new presentation in Google Slides, optionally in a specific folder.
The presentation will be tagged with the source app for filtering and can be
organized into folders for better management.

Args:
    title: Title of the new presentation
    folder_id: Optional folder ID where the presentation should be created
    width_emu: Optional page width in EMU. Must be set together with height_emu.
    height_emu: Optional page height in EMU. Must be set together with width_emu.

Returns:
    Created presentation details including its ID, title, URL, available layouts
    (with layoutId for use with add_slide), and pageSize (width_emu, height_emu).

Example: {"title": "Q3 Sales Review"}
Parameter Type Required Description
title string Yes Title of the new presentation
account string | null No Optional Google account to create the presentation in (email). The presentation is created on, and owned by, this account. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
folder_id string | null No Optional folder ID where the presentation should be created
folder_name string | null No Optional folder name. Searches My Drive top-level folders; creates if not found; errors on multiple matches. Ignored if folder_id is provided.
width_emu integer | null No Optional page width in EMU (English Metric Units). Must be set together with height_emu.
height_emu integer | null No Optional page height in EMU (English Metric Units). Must be set together with width_emu.
Parameter schema (JSON)
{
  "description": "Parameters for creating a new presentation",
  "properties": {
    "title": {
      "description": "Title of the new presentation",
      "title": "Title",
      "type": "string"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account to create the presentation in (email). The presentation is created on, and owned by, this account. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    },
    "folder_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional folder ID where the presentation should be created",
      "title": "Folder Id"
    },
    "folder_name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional folder name. Searches My Drive top-level folders; creates if not found; errors on multiple matches. Ignored if folder_id is provided.",
      "title": "Folder Name"
    },
    "width_emu": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional page width in EMU (English Metric Units). Must be set together with height_emu.",
      "title": "Width Emu"
    },
    "height_emu": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional page height in EMU (English Metric Units). Must be set together with width_emu.",
      "title": "Height Emu"
    }
  },
  "required": [
    "title"
  ],
  "title": "CreatePresentationParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of creating a presentation",
  "properties": {
    "presentation_id": {
      "description": "ID of the created presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "title": {
      "description": "Title of the presentation",
      "title": "Title",
      "type": "string"
    },
    "url": {
      "description": "URL to access the presentation",
      "title": "Url",
      "type": "string"
    },
    "default_slide": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Default slide info with slideId and placeholders list (each with objectId, type, index)",
      "title": "Default Slide"
    },
    "layouts": {
      "description": "Available slide layouts with layoutId and name, for use with add_slide's layoutId parameter",
      "items": {
        "additionalProperties": true,
        "type": "object"
      },
      "title": "Layouts",
      "type": "array"
    },
    "page_size": {
      "additionalProperties": true,
      "description": "Page dimensions: width_emu and height_emu in English Metric Units",
      "title": "Page Size",
      "type": "object"
    }
  },
  "required": [
    "presentation_id",
    "title",
    "url"
  ],
  "title": "CreatePresentationResult",
  "type": "object"
}

# create_shape write

Create a styled geometric shape with optional inline text and return the new shape element details.

Full description
Create a geometric shape on a slide with full styling control.

Supports solid fills, transparency, outline customization, and optional
inline text. Gradient fills are not supported by the Google Slides API
for shapes. For shapes that serve as visual containers (cards, badges,
icons), use the text parameters to put text directly in the shape
instead of creating a separate text box overlay.

Position and size are specified in EMU (English Metric Units).
1 inch = 914400 EMU. 1 point = 12700 EMU.

Common valid shapeTypes: RECTANGLE, ROUND_RECTANGLE, ELLIPSE, TRIANGLE,
RIGHT_TRIANGLE, PARALLELOGRAM, TRAPEZOID, PENTAGON, HEXAGON, HEPTAGON,
OCTAGON, DECAGON, DODECAGON, STAR_4, STAR_5, STAR_6, STAR_8, STAR_10,
STAR_12, STAR_16, STAR_24, STAR_32, DIAMOND, PLUS, HEART, ARROW_NORTH,
ARROW_EAST, ARROW_SOUTH, ARROW_WEST, CLOUD, etc.

Common shape types: RECTANGLE, ROUND_RECTANGLE, ELLIPSE, TRIANGLE,
RIGHT_TRIANGLE, DIAMOND, PENTAGON, HEXAGON, OCTAGON, STAR_4, STAR_5,
STAR_6, STAR_8, HEART, CLOUD, ARROW_RIGHT (RIGHT_ARROW),
LEFT_ARROW, UP_ARROW, DOWN_ARROW, CHEVRON, PLUS, MOON, LIGHTNING_BOLT,
WEDGE_RECTANGLE_CALLOUT, WEDGE_ELLIPSE_CALLOUT. For the full list of
valid shape types, see the Google Slides API ShapeType enum.

Args:
    presentation_id: ID of the presentation
    slide_id: ID of the slide to add the shape to
    shape_type: Shape type (RECTANGLE, ROUND_RECTANGLE, ELLIPSE, TRIANGLE, etc.)
    x: X position in EMU
    y: Y position in EMU
    width: Width of the shape in EMU
    height: Height of the shape in EMU
    fill_color: Solid fill color as hex (e.g., "#FF6D3A")
    fill_alpha: Fill transparency 0.0-1.0 (default 1.0 = fully opaque). Requires fill_color.
    no_fill: If True, shape has no fill (transparent background)
    outline_color: Outline color as hex. Omit to keep theme default.
    outline_weight: Outline thickness in points
    outline_visible: Whether outline is rendered (False hides it). Omit to keep theme default.
    outline_dash: Dash style — SOLID, DOT, DASH, DASH_DOT, LONG_DASH, LONG_DASH_DOT. Omit to keep theme default.
    text: Optional text content placed inside the shape
    font_size_pt: Text font size in points
    font_family: Text font family
    bold: Text bold style
    italic: Text italic style
    text_color: Text color as hex
    alignment: Horizontal text alignment (LEFT, CENTER, RIGHT, JUSTIFIED)
    vertical_alignment: Vertical text anchoring (TOP, MIDDLE, BOTTOM). Requires text.
    rotation: Shape rotation in degrees

Returns:
    Status of the operation, ID of the created shape, and success message.

Example: {"presentation_id": "abc123", "slide_id": "p2", "shape_type": "ROUND_RECTANGLE", "x": 457200, "y": 457200, "width": 3000000, "height": 1500000, "fill_color": "#FF6D3A", "text": "Click here", "font_size_pt": 18, "text_color": "#FFFFFF", "alignment": "CENTER"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
slide_id string Yes ID of the slide to add the shape to
shape_type string Yes Type of shape (e.g., RECTANGLE, ELLIPSE, TRIANGLE, ARROW_RIGHT, STAR_5)
x number Yes X position in EMU
y number Yes Y position in EMU
width number Yes Width of the shape in EMU
height number Yes Height of the shape in EMU
fill_color string | null No Optional hex color for shape fill
fill_alpha number | null No Opacity of the fill color, 0.0 (transparent) to 1.0 (opaque). Requires fill_color to be set.
no_fill boolean | null No If True, shape has no fill (transparent background)
outline_color string | null No Hex color for shape outline. Omit to keep theme default.
outline_weight number | null No Outline weight in points Default: 1
outline_visible boolean | null No Whether outline is visible (False hides it). Omit to keep theme default.
outline_dash string | null No Dash style for outline: SOLID, DOT, DASH, DASH_DOT, LONG_DASH, LONG_DASH_DOT. Omit to keep theme default.
text string | null No Optional text content placed inside the shape
font_size_pt number | null No Font size in points for inline text
font_family string | null No Font family for inline text
bold boolean | null No Bold for inline text
italic boolean | null No Italic for inline text
text_color string | null No Text color as hex for inline text
alignment string | null No Horizontal text alignment (LEFT, CENTER, RIGHT, JUSTIFIED)
vertical_alignment string | null No Vertical text alignment: TOP, MIDDLE, BOTTOM. Requires text to be set.
rotation number | null No Rotation in degrees
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for creating a shape",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the slide to add the shape to",
      "title": "Slide Id",
      "type": "string"
    },
    "shape_type": {
      "description": "Type of shape (e.g., RECTANGLE, ELLIPSE, TRIANGLE, ARROW_RIGHT, STAR_5)",
      "title": "Shape Type",
      "type": "string"
    },
    "x": {
      "description": "X position in EMU",
      "title": "X",
      "type": "number"
    },
    "y": {
      "description": "Y position in EMU",
      "title": "Y",
      "type": "number"
    },
    "width": {
      "description": "Width of the shape in EMU",
      "title": "Width",
      "type": "number"
    },
    "height": {
      "description": "Height of the shape in EMU",
      "title": "Height",
      "type": "number"
    },
    "fill_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional hex color for shape fill",
      "title": "Fill Color"
    },
    "fill_alpha": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Opacity of the fill color, 0.0 (transparent) to 1.0 (opaque). Requires fill_color to be set.",
      "title": "Fill Alpha"
    },
    "no_fill": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "If True, shape has no fill (transparent background)",
      "title": "No Fill"
    },
    "outline_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Hex color for shape outline. Omit to keep theme default.",
      "title": "Outline Color"
    },
    "outline_weight": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": 1,
      "description": "Outline weight in points",
      "title": "Outline Weight"
    },
    "outline_visible": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether outline is visible (False hides it). Omit to keep theme default.",
      "title": "Outline Visible"
    },
    "outline_dash": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Dash style for outline: SOLID, DOT, DASH, DASH_DOT, LONG_DASH, LONG_DASH_DOT. Omit to keep theme default.",
      "title": "Outline Dash"
    },
    "text": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional text content placed inside the shape",
      "title": "Text"
    },
    "font_size_pt": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Font size in points for inline text",
      "title": "Font Size Pt"
    },
    "font_family": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Font family for inline text",
      "title": "Font Family"
    },
    "bold": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Bold for inline text",
      "title": "Bold"
    },
    "italic": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Italic for inline text",
      "title": "Italic"
    },
    "text_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Text color as hex for inline text",
      "title": "Text Color"
    },
    "alignment": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Horizontal text alignment (LEFT, CENTER, RIGHT, JUSTIFIED)",
      "title": "Alignment"
    },
    "vertical_alignment": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Vertical text alignment: TOP, MIDDLE, BOTTOM. Requires text to be set.",
      "title": "Vertical Alignment"
    },
    "rotation": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Rotation in degrees",
      "title": "Rotation"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "slide_id",
    "shape_type",
    "x",
    "y",
    "width",
    "height"
  ],
  "title": "CreateShapeParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of creating a shape",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "shape_id": {
      "description": "ID of the created shape",
      "title": "Shape Id",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "shape_id",
    "message"
  ],
  "title": "CreateShapeResult",
  "type": "object"
}

# create_table write

Create a native slide table with optional initial styling and return the new table element details.

Full description
Create a native table on a slide with optional initial values and styling.

Tables support cell-level formatting via the update_table_cell tool.
For header-styled tables, use header_fill_color and header_bold to
style the first row automatically.

Args:
    presentation_id: ID of the presentation
    slide_id: ID of the slide
    rows: Number of table rows (1-20)
    columns: Number of table columns (1-20)
    x: X position in EMU
    y: Y position in EMU
    width: Table width in EMU
    height: Table height in EMU
    values: 2D string array for initial cell values (row-major order).
            Must be empty string "" for blank cells, not null.
    header_fill_color: Background color for row 0
    header_text_color: Text color for row 0
    header_bold: Whether row 0 text is bold (default True)
    header_font_size_pt: Font size for row 0 in points
    body_font_size_pt: Font size for rows 1+ in points
    alternate_row_color: Fill color for even-numbered body rows (striping)
    column_widths: Proportional column widths (must sum to ~1.0)

Returns:
    CreateTableResult with element ID and dimensions

Example: {"presentation_id": "abc123", "slide_id": "p2", "rows": 3, "columns": 2, "x": 457200, "y": 1600200, "width": 7772400, "height": 2743200, "values": [["Name", "Score"], ["Alice", "95"], ["Bob", "87"]], "header_fill_color": "#1A1F36", "header_text_color": "#FFFFFF"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
slide_id string Yes ID of the slide
rows integer Yes Number of rows (1-20)
columns integer Yes Number of columns (1-20)
x number Yes X position in EMU
y number Yes Y position in EMU
width number Yes Table width in EMU
height number Yes Table height in EMU
values array<array<string>> | null No 2D string array for initial cell values (row-major order). Must be empty string '' for blank cells, not null.
header_fill_color string | null No Background color for row 0 (e.g., '#FF6D3A')
header_text_color string | null No Text color for row 0 (e.g., '#FFFFFF')
header_bold boolean | null No Whether row 0 text is bold (default True) Default: true
header_font_size_pt number | null No Font size for row 0 in points Default: 14
body_font_size_pt number | null No Font size for rows 1+ in points Default: 12
alternate_row_color string | null No Fill color for even-numbered body rows (striping)
column_widths array<number> | null No Proportional column widths (must sum to ~1.0), e.g. [0.3, 0.2, 0.25, 0.25]
autofit boolean | null No Shrink header and body font sizes to fit table within the specified height. Uses HarfBuzz text measurement assuming Arial font metrics. Default: false
min_font_size_pt number | null No Minimum font size in points when autofit is enabled (default: 8pt) Default: 8
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for creating a table on a slide",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the slide",
      "title": "Slide Id",
      "type": "string"
    },
    "rows": {
      "description": "Number of rows (1-20)",
      "maximum": 20,
      "minimum": 1,
      "title": "Rows",
      "type": "integer"
    },
    "columns": {
      "description": "Number of columns (1-20)",
      "maximum": 20,
      "minimum": 1,
      "title": "Columns",
      "type": "integer"
    },
    "x": {
      "description": "X position in EMU",
      "title": "X",
      "type": "number"
    },
    "y": {
      "description": "Y position in EMU",
      "title": "Y",
      "type": "number"
    },
    "width": {
      "description": "Table width in EMU",
      "title": "Width",
      "type": "number"
    },
    "height": {
      "description": "Table height in EMU",
      "title": "Height",
      "type": "number"
    },
    "values": {
      "anyOf": [
        {
          "items": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "2D string array for initial cell values (row-major order). Must be empty string '' for blank cells, not null.",
      "title": "Values"
    },
    "header_fill_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Background color for row 0 (e.g., '#FF6D3A')",
      "title": "Header Fill Color"
    },
    "header_text_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Text color for row 0 (e.g., '#FFFFFF')",
      "title": "Header Text Color"
    },
    "header_bold": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": true,
      "description": "Whether row 0 text is bold (default True)",
      "title": "Header Bold"
    },
    "header_font_size_pt": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": 14,
      "description": "Font size for row 0 in points",
      "title": "Header Font Size Pt"
    },
    "body_font_size_pt": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": 12,
      "description": "Font size for rows 1+ in points",
      "title": "Body Font Size Pt"
    },
    "alternate_row_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Fill color for even-numbered body rows (striping)",
      "title": "Alternate Row Color"
    },
    "column_widths": {
      "anyOf": [
        {
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Proportional column widths (must sum to ~1.0), e.g. [0.3, 0.2, 0.25, 0.25]",
      "title": "Column Widths"
    },
    "autofit": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": false,
      "description": "Shrink header and body font sizes to fit table within the specified height. Uses HarfBuzz text measurement assuming Arial font metrics.",
      "title": "Autofit"
    },
    "min_font_size_pt": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": 8,
      "description": "Minimum font size in points when autofit is enabled (default: 8pt)",
      "title": "Min Font Size Pt"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "slide_id",
    "rows",
    "columns",
    "x",
    "y",
    "width",
    "height"
  ],
  "title": "CreateTableParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of creating a table",
  "properties": {
    "element_id": {
      "description": "ID of the created table element",
      "title": "Element Id",
      "type": "string"
    },
    "rows": {
      "description": "Number of rows",
      "title": "Rows",
      "type": "integer"
    },
    "columns": {
      "description": "Number of columns",
      "title": "Columns",
      "type": "integer"
    },
    "autofit_applied": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether autofit scaled the fonts",
      "title": "Autofit Applied"
    },
    "scale_factor": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Scale factor applied (1.0 = no change)",
      "title": "Scale Factor"
    }
  },
  "required": [
    "element_id",
    "rows",
    "columns"
  ],
  "title": "CreateTableResult",
  "type": "object"
}

# delete_element write

Delete any slide element like text, shape, image, chart, or table and return operation status.

Full description
Delete an element from a slide (text box, shape, table, image, chart, or any other page element).

Permanently removes a shape, text box, image, table, or other element from a slide.

Args:
    presentation_id: ID of the presentation
    element_id: ID of the element to delete

Returns:
    Status of the operation and success message.

Example: {"presentation_id": "abc123", "element_id": "textbox_a1b2c3d4"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
element_id string Yes ID of the element to delete
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for deleting an element from a slide",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the element to delete",
      "title": "Element Id",
      "type": "string"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "element_id"
  ],
  "title": "DeleteElementParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of deleting an element from a slide",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "message"
  ],
  "title": "DeleteElementResult",
  "type": "object"
}

# delete_slide write

Delete a slide from a presentation and return confirmation of the removal.

Full description
Delete a slide from a presentation.

Permanently removes the specified slide from the presentation.

Args:
    presentation_id: ID of the presentation
    slide_id: ID of the slide to delete

Returns:
    Status of the operation and success message.

Example: {"presentation_id": "abc123", "slide_id": "p2"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
slide_id string Yes ID of the slide to delete
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for deleting a slide",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the slide to delete",
      "title": "Slide Id",
      "type": "string"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "slide_id"
  ],
  "title": "DeleteSlideParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of deleting a slide",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "message"
  ],
  "title": "DeleteSlideResult",
  "type": "object"
}

# duplicate_slide write

Duplicate a slide with all content and formatting and return the new slide's details.

Full description
Duplicate an existing slide with all its content elements.

Creates an exact copy of the slide, including all shapes, text boxes,
tables, images, and formatting. The copy is inserted after the source
slide by default, or at a specific position if insertion_index is provided.

Returns a mapping of original element IDs to new element IDs, allowing
the agent to immediately update content on the duplicated slide.

Args:
    presentation_id: ID of the presentation
    slide_id: ID of the slide to duplicate
    insertion_index: 0-based position for the copy (default: after source)

Returns:
    DuplicateSlideResult with new slide ID and element ID mappings

Example: {"presentation_id": "abc123", "slide_id": "p2"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
slide_id string Yes ID of the slide to duplicate
insertion_index integer | null No 0-based position for the copy (default: immediately after source)
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for duplicating a slide",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the slide to duplicate",
      "title": "Slide Id",
      "type": "string"
    },
    "insertion_index": {
      "anyOf": [
        {
          "minimum": 0,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "0-based position for the copy (default: immediately after source)",
      "title": "Insertion Index"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "slide_id"
  ],
  "title": "DuplicateSlideParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of duplicating a slide",
  "properties": {
    "new_slide_id": {
      "description": "ID of the newly created slide copy",
      "title": "New Slide Id",
      "type": "string"
    },
    "element_id_mappings": {
      "additionalProperties": {
        "type": "string"
      },
      "description": "Mapping of original element IDs to new element IDs",
      "title": "Element Id Mappings",
      "type": "object"
    }
  },
  "required": [
    "new_slide_id",
    "element_id_mappings"
  ],
  "title": "DuplicateSlideResult",
  "type": "object"
}

# embed_chart write

Embed a Google Sheets chart as linked or static content on a slide and return the chart element details.

Full description
Embed a chart from a Google Sheets spreadsheet onto a slide.

Creates a Sheets chart element on the specified slide. The chart can be
linked (live connection to the spreadsheet, refreshable) or a static
snapshot image.

To find the chart_id, use the Google Sheets get_spreadsheet_metadata or
list_charts tool -- each chart object includes a numeric chart_id field.

Position and size are specified in EMU (English Metric Units).
1 inch = 914400 EMU.

Args:
    presentation_id: ID of the presentation
    slide_id: ID of the slide to embed the chart on
    spreadsheet_id: ID of the Google Sheets spreadsheet containing the chart
    chart_id: The numeric chart ID within the spreadsheet
    x: X position in EMU
    y: Y position in EMU
    width: Width of the chart in EMU
    height: Height of the chart in EMU
    linking_mode: LINKED (live, refreshable) or NOT_LINKED_IMAGE (static snapshot)

Returns:
    Status, element ID, source spreadsheet and chart IDs, and linking mode.

Example: {"presentation_id": "abc123", "slide_id": "p2", "spreadsheet_id": "1xYzAbC_spreadsheet", "chart_id": 12345, "x": 457200, "y": 914400, "width": 5486400, "height": 3657600}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
slide_id string Yes ID of the slide to embed the chart on
spreadsheet_id string Yes ID of the Google Sheets spreadsheet containing the chart
chart_id integer Yes The numeric chart ID within the spreadsheet (visible in the Sheets chart URL or via Google Sheets API)
x number Yes X position in EMU (1 inch = 914400 EMU)
y number Yes Y position in EMU
width number Yes Width of the chart in EMU
height number Yes Height of the chart in EMU
linking_mode string No LINKED keeps a live link to the spreadsheet (can be refreshed); NOT_LINKED_IMAGE embeds a static snapshot Default: "LINKED"
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for embedding a Google Sheets chart into a slide",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the slide to embed the chart on",
      "title": "Slide Id",
      "type": "string"
    },
    "spreadsheet_id": {
      "description": "ID of the Google Sheets spreadsheet containing the chart",
      "title": "Spreadsheet Id",
      "type": "string"
    },
    "chart_id": {
      "description": "The numeric chart ID within the spreadsheet (visible in the Sheets chart URL or via Google Sheets API)",
      "title": "Chart Id",
      "type": "integer"
    },
    "x": {
      "description": "X position in EMU (1 inch = 914400 EMU)",
      "title": "X",
      "type": "number"
    },
    "y": {
      "description": "Y position in EMU",
      "title": "Y",
      "type": "number"
    },
    "width": {
      "description": "Width of the chart in EMU",
      "title": "Width",
      "type": "number"
    },
    "height": {
      "description": "Height of the chart in EMU",
      "title": "Height",
      "type": "number"
    },
    "linking_mode": {
      "default": "LINKED",
      "description": "LINKED keeps a live link to the spreadsheet (can be refreshed); NOT_LINKED_IMAGE embeds a static snapshot",
      "title": "Linking Mode",
      "type": "string"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "slide_id",
    "spreadsheet_id",
    "chart_id",
    "x",
    "y",
    "width",
    "height"
  ],
  "title": "EmbedChartParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of embedding a chart",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the created chart element on the slide",
      "title": "Element Id",
      "type": "string"
    },
    "spreadsheet_id": {
      "description": "Source spreadsheet ID",
      "title": "Spreadsheet Id",
      "type": "string"
    },
    "chart_id": {
      "description": "Source chart ID",
      "title": "Chart Id",
      "type": "integer"
    },
    "linking_mode": {
      "description": "Linking mode used",
      "title": "Linking Mode",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "element_id",
    "spreadsheet_id",
    "chart_id",
    "linking_mode",
    "message"
  ],
  "title": "EmbedChartResult",
  "type": "object"
}

# get_presentation_overview read

Read a presentation's structure, slide summaries, and available layout IDs for planning edits.

Full description
Get an overview of a presentation including slide summaries.

Retrieves the structure and basic information about all slides in a presentation,
including element counts and layout information for each slide. Also returns
the available slide layouts with their IDs and names, which can be used with
add_slide's layoutId parameter.

Args:
    presentation_id: ID of the presentation to get overview for

Returns:
    Presentation overview with ID, title, total slide count, detailed
    summaries of each slide, available layouts (layoutId, name, displayName),
    and page dimensions.

Example: {"presentation_id": "1BxiMVs0XRA5nFMdKvBdBZjgmUii_abc12"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation to get overview for
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for getting presentation overview",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation to get overview for",
      "title": "Presentation Id",
      "type": "string"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id"
  ],
  "title": "GetPresentationOverviewParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of getting presentation overview",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "title": {
      "description": "Title of the presentation",
      "title": "Title",
      "type": "string"
    },
    "total_slides": {
      "description": "Total number of slides",
      "title": "Total Slides",
      "type": "integer"
    },
    "slides": {
      "description": "List of slide summaries",
      "items": {
        "additionalProperties": true,
        "type": "object"
      },
      "title": "Slides",
      "type": "array"
    },
    "layouts": {
      "description": "Available slide layouts with layoutId and name, for use with add_slide's layoutId parameter",
      "items": {
        "additionalProperties": true,
        "type": "object"
      },
      "title": "Layouts",
      "type": "array"
    },
    "page_size": {
      "additionalProperties": true,
      "description": "Page dimensions: width_emu and height_emu in English Metric Units",
      "title": "Page Size",
      "type": "object"
    }
  },
  "required": [
    "presentation_id",
    "title",
    "total_slides",
    "slides"
  ],
  "title": "GetPresentationOverviewResult",
  "type": "object"
}

# get_slide_content_elements read

Get all content elements from a specific slide with detailed formatting.

Full description
Get all content elements from a specific slide with detailed formatting.

Retrieves all shapes, text boxes, images, and tables on the slide. For elements
containing text, it provides a detailed breakdown of paragraphs and text runs,
including specific styling for each run (font, size, color, etc.).

Also returns the slide background configuration (solid color or image fill)
so that a separate API call is not needed for background info.

Args:
    presentation_id: ID of the presentation
    slide_id: ID of the slide

Returns:
    A list of content elements on the slide. Each element includes its ID, type,
    size, and position. Text boxes will contain a text_content object
    detailing the paragraphs and styled runs, plus estimatedContentHeight (EMU),
    estimatedUsableHeight (EMU, box height minus Google Slides' text inset),
    and estimatedOverflow (boolean) for vertical overflow detection. They also
    include estimatedContentWidth (EMU, the widest single rendered line),
    estimatedUsableWidth (EMU, box width minus the horizontal inset), and
    estimatedHorizontalOverflow (boolean) for horizontal overflow — text
    bleeding past the box's sides, which the vertical checks cannot catch. This
    fires for unbreakable content wider than the box (oversized drop-cap glyphs,
    big numerals, long URLs); normally-wrapping text never trips it. Shapes and
    text boxes also include outline_visible (True if the border renders, False if
    hidden, None when inherited from the theme). Tables include
    estimatedContentHeight and estimatedOverflow when table height estimation
    succeeds. Also includes a
    background field with the slide background type (solid/image) and color or
    image URL.

    Text boxes include an autofit field with:
    - googleAutofitType: Google's native autofit setting (NONE, SHAPE_AUTOFIT,
      TEXT_AUTOFIT). Text boxes created with add_text_box autofit:true will show
      NONE here because Toolforest pre-scales font sizes at creation time rather
      than using Google's native autofit. This is expected — check the actual
      font sizes in text_content runs to see the scaled values.
    - googleFontScale: Google's font scale factor (only populated when
      googleAutofitType is SHAPE_AUTOFIT).

Example: {"presentation_id": "abc123", "slide_id": "p2"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
slide_id string Yes ID of the slide
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for getting slide content elements",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the slide",
      "title": "Slide Id",
      "type": "string"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "slide_id"
  ],
  "title": "GetSlideContentElementsParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of getting slide content elements",
  "properties": {
    "elements": {
      "description": "List of content elements on the slide. Text boxes include estimatedContentHeight (EMU), estimatedUsableHeight (EMU, box height minus Google Slides text inset), and estimatedOverflow (boolean) for vertical overflow; plus estimatedContentWidth (EMU, widest rendered line), estimatedUsableWidth (EMU, box width minus horizontal inset), and estimatedHorizontalOverflow (boolean) for horizontal overflow/bleed (e.g. oversized drop-cap glyphs). Shapes and text boxes also include outline_visible (True/False, or None when inherited from the theme). Tables include estimatedContentHeight and estimatedOverflow when table height estimation succeeds.",
      "items": {
        "additionalProperties": true,
        "type": "object"
      },
      "title": "Elements",
      "type": "array"
    },
    "background": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Slide background info: type (solid/image), color RGB values, or image URL",
      "title": "Background"
    },
    "page_size": {
      "additionalProperties": true,
      "description": "Page dimensions: width_emu and height_emu in English Metric Units",
      "title": "Page Size",
      "type": "object"
    }
  },
  "required": [
    "elements"
  ],
  "title": "GetSlideContentElementsResult",
  "type": "object"
}

# get_slide_thumbnail read

Get a slide thumbnail as base64 bytes, the Google CDN URL, or a Toolforest presigned S3 URL (recommended for agents).

Full description
Generate and retrieve a thumbnail image of a specific slide.

Three return modes:
- 'base64' (default, back-compat): inline base64 image bytes. Bloats
  LLM context for large images.
- 'google_url': Google CDN URL. Requires Google session auth — agents
  and external clients fetching the URL will get HTTP 403.
- 'presigned_url': Toolforest-managed S3 presigned URL. Publicly
  fetchable for the configured TTL (default 1h). Recommended for LLM
  agents and any non-browser caller.

Args:
    presentation_id: ID of the presentation
    slide_id: ID of the slide
    mime_type: Image format - PNG or JPEG (default: PNG)
    return_mode: 'base64' | 'google_url' | 'presigned_url'
    return_url: deprecated — use return_mode='google_url'
    presigned_url_ttl_seconds: TTL for presigned URLs (60–86400, default 3600)

Returns:
    thumbnailBase64 (base64 mode), thumbnailUrl (url modes),
    expiresAt (presigned mode only), and mimeType.

Example: {"presentation_id": "abc123", "slide_id": "p2", "return_mode": "presigned_url"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
slide_id string Yes ID of the slide
mime_type string | null No Image format (PNG or JPEG) Default: "PNG"
return_mode "base64" | "google_url" | "presigned_url" | null No How to return the thumbnail. 'base64' inlines image bytes (large; default for back-compat). 'google_url' returns the Google CDN URL (requires Google session auth — agents/external clients get 403). 'presigned_url' uploads to a Toolforest S3 bucket and returns a publicly-fetchable presigned URL — recommended for LLM agents.
return_url boolean | null No Deprecated: use return_mode='google_url' instead. If true and return_mode is unset, behaves as return_mode='google_url'. Default: false
presigned_url_ttl_seconds integer | null No TTL for the presigned URL when return_mode='presigned_url'. Range: 60–86400 seconds. Default: 3600 (1 hour). Ignored for other return modes. Default: 3600
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for getting slide thumbnail",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the slide",
      "title": "Slide Id",
      "type": "string"
    },
    "mime_type": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": "PNG",
      "description": "Image format (PNG or JPEG)",
      "title": "Mime Type"
    },
    "return_mode": {
      "anyOf": [
        {
          "enum": [
            "base64",
            "google_url",
            "presigned_url"
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "How to return the thumbnail. 'base64' inlines image bytes (large; default for back-compat). 'google_url' returns the Google CDN URL (requires Google session auth — agents/external clients get 403). 'presigned_url' uploads to a Toolforest S3 bucket and returns a publicly-fetchable presigned URL — recommended for LLM agents.",
      "title": "Return Mode"
    },
    "return_url": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": false,
      "description": "Deprecated: use return_mode='google_url' instead. If true and return_mode is unset, behaves as return_mode='google_url'.",
      "title": "Return Url"
    },
    "presigned_url_ttl_seconds": {
      "anyOf": [
        {
          "maximum": 86400,
          "minimum": 60,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": 3600,
      "description": "TTL for the presigned URL when return_mode='presigned_url'. Range: 60–86400 seconds. Default: 3600 (1 hour). Ignored for other return modes.",
      "title": "Presigned Url Ttl Seconds"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "slide_id"
  ],
  "title": "GetSlideThumbnailParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of getting slide thumbnail",
  "properties": {
    "thumbnail_base64": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64-encoded thumbnail image (only when return_mode='base64')",
      "title": "Thumbnail Base64"
    },
    "thumbnail_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Thumbnail URL — Google CDN URL when return_mode='google_url' (auth-gated), or Toolforest presigned S3 URL when return_mode='presigned_url' (publicly fetchable)",
      "title": "Thumbnail Url"
    },
    "mime_type": {
      "description": "MIME type of the image",
      "title": "Mime Type",
      "type": "string"
    },
    "expires_at": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "ISO-8601 UTC timestamp when the presigned URL expires (only when return_mode='presigned_url')",
      "title": "Expires At"
    }
  },
  "required": [
    "mime_type"
  ],
  "title": "GetSlideThumbnailResult",
  "type": "object"
}

# list_accounts read

List the Google accounts the user has connected for Google Slides. Returns each account's email, name, and whether it's the current default for this MCP client. Use when the user mentions "my work account" / "my personal account" or asks which accounts are available — then pass `account=<email>` to target a non-default account. `account=<email>` is supported on all Google Slides tools.

Full description
Return the user's connected Google accounts for the current MCP client.

Returns:
    ListAccountsResult with one entry per connected Google account, including the
    account's email, display name (when available), and a boolean flag indicating
    which account is the current default for this user + MCP client.

When the user has multiple Google accounts connected, this tool is the canonical
way to discover what's available before invoking other Google Slides tools with an
explicit `account=...` override. Presentation/element IDs are scoped to the account
they were created on, so always target the matching account.

No parameters.

Parameter schema (JSON)
{
  "description": "Parameters for list_accounts.",
  "properties": {},
  "title": "ListAccountsParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "$defs": {
    "ConnectedAccount": {
      "description": "A single connected Google account.",
      "properties": {
        "email": {
          "default": "",
          "title": "Email",
          "type": "string"
        },
        "name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Name"
        },
        "is_default": {
          "default": false,
          "title": "Is Default",
          "type": "boolean"
        }
      },
      "title": "ConnectedAccount",
      "type": "object"
    }
  },
  "description": "Result of list_accounts.",
  "properties": {
    "accounts": {
      "items": {
        "$ref": "#/$defs/ConnectedAccount"
      },
      "title": "Accounts",
      "type": "array"
    }
  },
  "title": "ListAccountsResult",
  "type": "object"
}

# list_presentations read

List Google Slides presentations accessible from the user's Drive.

Full description
List Google Slides presentations from the user's Drive.

Uses a "Discovery & Adoption" model: lists ALL presentations accessible to the user
(not just toolkit-created ones), and lazily tags untagged files with sourceApp
on first discovery. This allows users to work with existing presentations without
requiring explicit registration via the picker.

Args:
    max_results: Maximum number of presentations to return (default: 10)
    folder_id: Optional folder ID to list presentations from

Returns:
    List of presentations with id, title, url, createdTime, modifiedTime, and total count.
    Note: Timestamps (createdTime, modifiedTime) are in UTC format (ISO 8601 with 'Z' suffix).
    When displaying results to users, convert timestamps to their local timezone using context
    from user memory or location data.

Example: {"max_results": 5}
Parameter Type Required Description
max_results integer | null No Maximum number of presentations to return (default: 10) Default: 10
folder_id string | null No Optional folder ID to list presentations from
account string | null No Optional Google account override (email, e.g. "alice.work@company.com"). Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for listing presentations",
  "properties": {
    "max_results": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": 10,
      "description": "Maximum number of presentations to return (default: 10)",
      "title": "Max Results"
    },
    "folder_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional folder ID to list presentations from",
      "title": "Folder Id"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email, e.g. \"alice.work@company.com\"). Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "title": "ListPresentationsParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of listing presentations",
  "properties": {
    "presentations": {
      "description": "List of presentation metadata",
      "items": {
        "additionalProperties": true,
        "type": "object"
      },
      "title": "Presentations",
      "type": "array"
    },
    "total": {
      "description": "Total number of presentations found",
      "title": "Total",
      "type": "integer"
    }
  },
  "required": [
    "presentations",
    "total"
  ],
  "title": "ListPresentationsResult",
  "type": "object"
}

# move_presentation_to_trash write

Move a presentation to Google Drive trash and return status of the soft-delete operation.

Full description
Move a Google Slides presentation to the trash.

This operation moves the presentation to the user's Google Drive trash.
The presentation can be restored from trash within 30 days. After 30 days,
it will be permanently deleted.

Note: This operation requires edit access to the presentation.

Args:
    presentation_id: The Google Slides presentation ID to move to trash

Returns:
    Confirmation of the trash operation with the presentation ID

Example: {"presentation_id": "1BxiMVs0XRA5nFMdKvBdBZjgmUii_abc12"}
Parameter Type Required Description
presentation_id string Yes The Google Slides presentation ID to move to trash
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for moving a presentation to trash",
  "properties": {
    "presentation_id": {
      "description": "The Google Slides presentation ID to move to trash",
      "title": "Presentation Id",
      "type": "string"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id"
  ],
  "title": "MovePresentationToTrashParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of moving a presentation to trash",
  "properties": {
    "success": {
      "description": "Whether the operation was successful",
      "title": "Success",
      "type": "boolean"
    },
    "presentation_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "The ID of the trashed presentation",
      "title": "Presentation Id"
    },
    "message": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Success message",
      "title": "Message"
    },
    "error": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Error message if failed",
      "title": "Error"
    }
  },
  "required": [
    "success"
  ],
  "title": "MovePresentationToTrashResult",
  "type": "object"
}

# reorder_element write

Change a slide element's z-order to send backward or bring forward and return status.

Full description
Change the z-order (layering) of a page element on its slide.

Use this to control which shapes appear in front of or behind others.
Common pattern: create a background rectangle, send it to back, then
add text boxes that appear in front.

Operations:
  - BRING_TO_FRONT: Move element to top of all layers
  - BRING_FORWARD: Move element one layer up
  - SEND_BACKWARD: Move element one layer down
  - SEND_TO_BACK: Move element to bottom of all layers

Args:
    presentation_id: ID of the presentation
    element_id: ID of the element to reorder
    operation: Z-order operation to perform

Returns:
    Confirmation with element ID and operation applied

Example: {"presentation_id": "abc123", "element_id": "shape_a1b2c3d4", "operation": "SEND_TO_BACK"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
element_id string Yes ID of the element to reorder
operation string Yes Z-order operation: BRING_TO_FRONT, BRING_FORWARD, SEND_BACKWARD, SEND_TO_BACK
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for reordering a page element's z-order",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the element to reorder",
      "title": "Element Id",
      "type": "string"
    },
    "operation": {
      "description": "Z-order operation: BRING_TO_FRONT, BRING_FORWARD, SEND_BACKWARD, SEND_TO_BACK",
      "title": "Operation",
      "type": "string"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "element_id",
    "operation"
  ],
  "title": "ReorderElementParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of reordering a page element's z-order",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the reordered element",
      "title": "Element Id",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "element_id",
    "message"
  ],
  "title": "ReorderElementResult",
  "type": "object"
}

# reorder_slide write

Move a slide to a new presentation position and return confirmation with its new index.

Full description
Move a slide to a different position in the presentation.

Args:
    presentation_id: ID of the presentation
    slide_id: ID of the slide to move
    insertion_index: 0-based target position (0 = first slide)

Returns:
    Confirmation with slide ID and new position

Example: {"presentation_id": "abc123", "slide_id": "p2", "insertion_index": 0}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
slide_id string Yes ID of the slide to move
insertion_index integer Yes 0-based target position (0 = first slide)
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for reordering a slide",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the slide to move",
      "title": "Slide Id",
      "type": "string"
    },
    "insertion_index": {
      "description": "0-based target position (0 = first slide)",
      "minimum": 0,
      "title": "Insertion Index",
      "type": "integer"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "slide_id",
    "insertion_index"
  ],
  "title": "ReorderSlideParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of reordering a slide",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "slide_id": {
      "description": "ID of the moved slide",
      "title": "Slide Id",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "slide_id",
    "message"
  ],
  "title": "ReorderSlideResult",
  "type": "object"
}

# replace_text write

Find and replace text across a presentation or selected slides and return match or update results.

Full description
Find and replace text throughout the presentation or specific slides.

Useful for template workflows: build a slide with placeholder text
like {{COMPANY_NAME}}, duplicate it, then replace text on each copy.

Args:
    presentation_id: ID of the presentation
    find_text: Text to search for
    replace_text: Replacement text (empty string to delete matches)
    match_case: Case-sensitive search (default False)
    page_object_ids: List of slide/page IDs to search. None = entire presentation.

Returns:
    Number of replacements made.

Example: {"presentation_id": "abc123", "find_text": "{{COMPANY_NAME}}", "replace_text": "Acme Corp", "match_case": true}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
find_text string Yes Text to search for
replace_text string Yes Replacement text (empty string to delete matches)
match_case boolean | null No Case-sensitive search (default False) Default: false
page_object_ids array<string> | null No List of slide/page IDs to search. None = entire presentation.
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for replacing text in a presentation",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "find_text": {
      "description": "Text to search for",
      "title": "Find Text",
      "type": "string"
    },
    "replace_text": {
      "description": "Replacement text (empty string to delete matches)",
      "title": "Replace Text",
      "type": "string"
    },
    "match_case": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": false,
      "description": "Case-sensitive search (default False)",
      "title": "Match Case"
    },
    "page_object_ids": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "List of slide/page IDs to search. None = entire presentation.",
      "title": "Page Object Ids"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "find_text",
    "replace_text"
  ],
  "title": "ReplaceTextParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of replacing text",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "occurrences_replaced": {
      "description": "Number of text occurrences replaced",
      "title": "Occurrences Replaced",
      "type": "integer"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "occurrences_replaced",
    "message"
  ],
  "title": "ReplaceTextResult",
  "type": "object"
}

# set_master_elements write

Define decorative master elements auto-added to new slides and return updated presentation settings.

Full description
Define decorative shapes that are automatically injected on every new slide.

Master elements are shape definitions (position, size, fill, outline) stored
in the presentation metadata. Whenever `add_slide` creates a new slide, these
shapes are automatically created on it and sent to the back of the z-order.

Use this for consistent decorative elements like accent bars, background
rectangles, or watermark shapes that should appear on every slide.

**sync_existing_slides**: If True, iterates over all existing slides and injects
the master elements (after removing any previously-injected master elements).

Each element definition needs:
- `element_id`: A unique name you choose (e.g. "accent_bar", "bg_rect")
- `shape_type`: Valid Slides API shape type (RECTANGLE, ELLIPSE, etc.)
- `x`, `y`, `width`, `height`: Position and size in EMU
- Optional fill and outline styling

Args:
    presentation_id: ID of the presentation
    elements: List of master element definitions
    sync_existing_slides: Also inject onto all existing slides (default False)

Returns:
    Status, count of elements stored, and count of slides updated.

Example: {"presentation_id": "abc123", "elements": [{"element_id": "accent_bar", "shape_type": "RECTANGLE", "x": 0, "y": 6400000, "width": 9144000, "height": 458000, "fill_color": "#FF6D3A"}], "sync_existing_slides": true}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
elements array<MasterElementDef> Yes List of master element definitions to store
sync_existing_slides boolean No If True, also inject master elements onto all existing slides (removes previous master elements first) Default: false
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "$defs": {
    "MasterElementDef": {
      "description": "Definition of a single master element to replicate on every new slide.",
      "properties": {
        "element_id": {
          "description": "Unique identifier for this master element",
          "title": "Element Id",
          "type": "string"
        },
        "shape_type": {
          "default": "RECTANGLE",
          "description": "Shape type (RECTANGLE, ELLIPSE, etc.)",
          "title": "Shape Type",
          "type": "string"
        },
        "x": {
          "description": "X position in EMU",
          "title": "X",
          "type": "integer"
        },
        "y": {
          "description": "Y position in EMU",
          "title": "Y",
          "type": "integer"
        },
        "width": {
          "description": "Width in EMU",
          "title": "Width",
          "type": "integer"
        },
        "height": {
          "description": "Height in EMU",
          "title": "Height",
          "type": "integer"
        },
        "fill_color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Fill color as hex",
          "title": "Fill Color"
        },
        "fill_alpha": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": 1,
          "description": "Fill transparency 0.0-1.0",
          "title": "Fill Alpha"
        },
        "outline_color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Outline color as hex",
          "title": "Outline Color"
        },
        "outline_weight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": 1,
          "description": "Outline thickness in points",
          "title": "Outline Weight"
        }
      },
      "required": [
        "element_id",
        "x",
        "y",
        "width",
        "height"
      ],
      "title": "MasterElementDef",
      "type": "object",
      "additionalProperties": false
    }
  },
  "description": "Parameters for set_master_elements tool.",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "elements": {
      "description": "List of master element definitions to store",
      "items": {
        "$ref": "#/$defs/MasterElementDef"
      },
      "title": "Elements",
      "type": "array"
    },
    "sync_existing_slides": {
      "default": false,
      "description": "If True, also inject master elements onto all existing slides (removes previous master elements first)",
      "title": "Sync Existing Slides",
      "type": "boolean"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "elements"
  ],
  "title": "SetMasterElementsParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of set_master_elements tool.",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    },
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "elements_stored": {
      "description": "Number of master element definitions stored",
      "title": "Elements Stored",
      "type": "integer"
    },
    "slides_updated": {
      "default": 0,
      "description": "Number of existing slides updated (if sync_existing_slides was True)",
      "title": "Slides Updated",
      "type": "integer"
    }
  },
  "required": [
    "status",
    "message",
    "presentation_id",
    "elements_stored"
  ],
  "title": "SetMasterElementsResult",
  "type": "object"
}

# set_page_background write

Set a solid background on a slide, layout, or master page and return update status.

Full description
Set the background of a slide, master, or layout.

Supports solid colors. When set on a master page, the background is inherited
by all slides using that master (unless overridden per-slide).

Note: The Google Slides API does not support gradient page backgrounds.
For gradient backgrounds, use `create_gradient` to generate and insert a
full-slide gradient image instead.

Args:
    presentation_id: ID of the presentation
    page_object_id: Page ID (slide, master, or layout)
    color: Solid background color as hex (e.g., "#1A1F36")
    gradient: Gradient specification (not supported for page backgrounds)

Returns:
    Confirmation with the page ID that was updated, or error for unsupported options.

Example: {"presentation_id": "abc123", "page_object_id": "p2", "color": "#1A1F36"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
page_object_id string Yes Page ID (slide, master, or layout)
color string | null No Solid background color as hex (e.g., #1A1F36)
gradient object | null No Gradient specification: {"type": "LINEAR"|"RADIAL", "angle": 0-360, "stops": [{"position": float, "color": "#hex"}]}
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for setting page background",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "page_object_id": {
      "description": "Page ID (slide, master, or layout)",
      "title": "Page Object Id",
      "type": "string"
    },
    "color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Solid background color as hex (e.g., #1A1F36)",
      "title": "Color"
    },
    "gradient": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Gradient specification: {\"type\": \"LINEAR\"|\"RADIAL\", \"angle\": 0-360, \"stops\": [{\"position\": float, \"color\": \"#hex\"}]}",
      "title": "Gradient"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "page_object_id"
  ],
  "title": "SetPageBackgroundParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of setting page background",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "message"
  ],
  "title": "SetPageBackgroundResult",
  "type": "object"
}

# set_theme write

Set presentation-wide theme colors, fonts, and master background and return saved theme settings.

Full description
Set presentation-wide theme properties.

Configures the master-slide background, theme color palette, and default
font families for body and heading text.  These preferences are stored in
the presentation's Drive appProperties so they survive round-trips and can
be read back by other tools.

**master_background**: Sets the master slide background.
- Use `color` for a solid color (e.g. "#1A1F36").
- Gradient fills are NOT supported by the Google Slides API for page
  backgrounds. Use `create_gradient` to generate and insert a gradient
  image instead.

**colors**: A dict mapping theme color type names to hex values.
Valid keys: dark1, light1, dark2, light2, accent1-accent6, hyperlink,
followedHyperlink.

**body_font_family / heading_font_family**: Stored as preferences. They do NOT
retroactively change existing text but will be available for future tools
that create text.

**default_text_color**: Hex color stored as a preference. When set, tools
like add_text_box, create_shape, create_table, and update_table_cell will
automatically use this color for text when no explicit color is specified.

Args:
    presentation_id: ID of the presentation
    master_background: Background for the master slide (solid color only)
    colors: Theme color overrides (type name -> hex color)
    body_font_family: Default body font family
    heading_font_family: Default heading font family
    default_text_color: Default text color as hex (e.g. '#FFFFFF')

Returns:
    Status, message describing what was applied, and the presentation ID.

Example: {"presentation_id": "abc123", "master_background": {"color": "#1A1F36"}, "default_text_color": "#FFFFFF", "body_font_family": "Inter", "heading_font_family": "Montserrat"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
master_background BackgroundSpec | null No Background for the master slide
colors object | null No Theme color overrides. Keys: dark1, light1, dark2, light2, accent1-accent6, hyperlink, followedHyperlink. Values: hex color strings.
body_font_family string | null No Default body font family (e.g. 'Open Sans')
heading_font_family string | null No Default heading font family (e.g. 'Montserrat')
default_text_color string Yes Default text color as hex (e.g. '#FFFFFF'). Applied automatically by text-creating tools (add_text_box, create_shape, create_table, update_table_cell) when no explicit color is specified. Required because Google Slides does NOT inherit text color from master slides — without this, text on dark backgrounds will be invisible.
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "$defs": {
    "BackgroundSpec": {
      "description": "Specification for a background fill.",
      "properties": {
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Solid background color as hex",
          "title": "Color"
        },
        "gradient": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/GradientStop"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Gradient stops (NOT supported by Google Slides API -- will return an error with guidance)",
          "title": "Gradient"
        }
      },
      "title": "BackgroundSpec",
      "type": "object",
      "additionalProperties": false
    },
    "GradientStop": {
      "description": "A single color stop in a gradient.",
      "properties": {
        "position": {
          "description": "Position of the stop (0.0 to 1.0)",
          "title": "Position",
          "type": "number"
        },
        "color": {
          "description": "Hex color at this stop (e.g. '#FF6D3A')",
          "title": "Color",
          "type": "string"
        }
      },
      "required": [
        "position",
        "color"
      ],
      "title": "GradientStop",
      "type": "object",
      "additionalProperties": false
    }
  },
  "description": "Parameters for set_theme tool.",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "master_background": {
      "anyOf": [
        {
          "$ref": "#/$defs/BackgroundSpec"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Background for the master slide"
    },
    "colors": {
      "anyOf": [
        {
          "additionalProperties": {
            "type": "string"
          },
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Theme color overrides. Keys: dark1, light1, dark2, light2, accent1-accent6, hyperlink, followedHyperlink. Values: hex color strings.",
      "title": "Colors"
    },
    "body_font_family": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Default body font family (e.g. 'Open Sans')",
      "title": "Body Font Family"
    },
    "heading_font_family": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Default heading font family (e.g. 'Montserrat')",
      "title": "Heading Font Family"
    },
    "default_text_color": {
      "description": "Default text color as hex (e.g. '#FFFFFF'). Applied automatically by text-creating tools (add_text_box, create_shape, create_table, update_table_cell) when no explicit color is specified. Required because Google Slides does NOT inherit text color from master slides — without this, text on dark backgrounds will be invisible.",
      "title": "Default Text Color",
      "type": "string"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "default_text_color"
  ],
  "title": "SetThemeParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of set_theme tool.",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "message": {
      "description": "Success message describing what was applied",
      "title": "Message",
      "type": "string"
    },
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    }
  },
  "required": [
    "status",
    "message",
    "presentation_id"
  ],
  "title": "SetThemeResult",
  "type": "object"
}

# share_presentation write

Share a presentation with users or link access and return the applied sharing permissions.

Full description
Share a presentation with specific users and/or enable link sharing.

Supports two sharing modes (can be combined):
1. Named recipients: Share with specific email addresses
2. Link sharing: Make accessible to anyone with the link (no Google account required)

Args:
    presentation_id: The Google Slides presentation ID (required)
    recipients: List of dicts with 'email_address' and 'role' (optional).
        Roles: 'reader', 'writer', 'commenter'
    link_sharing: Enable "anyone with the link" access (optional).
        Valid values: 'reader', 'writer', 'commenter'.
        When set, returns a shareable link in the response.
    send_notification: Whether to send notification emails for named recipients (default true)

Returns:
    SharePresentationResult with shared_with list, link_sharing_role, and shareable_link

Example: {"presentation_id": "abc123", "link_sharing": "reader"}
Parameter Type Required Description
presentation_id string Yes The Google Slides presentation ID
recipients array<object> | null No List of dicts with 'email_address' and 'role' (reader, writer, commenter)
link_sharing "reader" | "writer" | "commenter" | null No Enable 'anyone with the link' access. Valid values: reader, writer, commenter
send_notification boolean | null No Whether to send notification emails for named recipients Default: true
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "properties": {
    "presentation_id": {
      "description": "The Google Slides presentation ID",
      "title": "Presentation Id",
      "type": "string"
    },
    "recipients": {
      "anyOf": [
        {
          "items": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "List of dicts with 'email_address' and 'role' (reader, writer, commenter)",
      "title": "Recipients"
    },
    "link_sharing": {
      "anyOf": [
        {
          "enum": [
            "reader",
            "writer",
            "commenter"
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Enable 'anyone with the link' access. Valid values: reader, writer, commenter",
      "title": "Link Sharing"
    },
    "send_notification": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": true,
      "description": "Whether to send notification emails for named recipients",
      "title": "Send Notification"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id"
  ],
  "title": "SharePresentationParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "properties": {
    "success": {
      "description": "Whether the operation was successful",
      "title": "Success",
      "type": "boolean"
    },
    "data": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Raw API response data",
      "title": "Data"
    },
    "link_sharing_role": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Link sharing role set (reader, writer, or commenter)",
      "title": "Link Sharing Role"
    },
    "shareable_link": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "URL for sharing when link_sharing is enabled",
      "title": "Shareable Link"
    },
    "error": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Error message if operation failed",
      "title": "Error"
    }
  },
  "required": [
    "success"
  ],
  "title": "SharePresentationResult",
  "type": "object"
}

# transform_element write

Reposition, resize, or rotate an existing element and return its updated transform details.

Full description
Reposition, resize, or rotate an existing page element.

Only provided parameters are updated. Useful for adjusting layout
after content changes or for animation-like positioning.

Position and size are specified in EMU (English Metric Units).
1 inch = 914400 EMU. 1 point = 12700 EMU.

Args:
    presentation_id: ID of the presentation
    element_id: ID of the element to transform
    x: New X position in EMU (top-left corner)
    y: New Y position in EMU (top-left corner)
    width: New width in EMU
    height: New height in EMU
    rotation: Rotation angle in degrees

Returns:
    Confirmation with element ID and new transform values.

Example: {"presentation_id": "abc123", "element_id": "shape_a1b2c3d4", "x": 914400, "y": 914400, "width": 4572000}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
element_id string Yes ID of the element to transform
x number | null No New X position in EMU
y number | null No New Y position in EMU
width number | null No New width in EMU
height number | null No New height in EMU
rotation number | null No Rotation angle in degrees
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for transforming (repositioning/resizing/rotating) an element",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the element to transform",
      "title": "Element Id",
      "type": "string"
    },
    "x": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "New X position in EMU",
      "title": "X"
    },
    "y": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "New Y position in EMU",
      "title": "Y"
    },
    "width": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "New width in EMU",
      "title": "Width"
    },
    "height": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "New height in EMU",
      "title": "Height"
    },
    "rotation": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Rotation angle in degrees",
      "title": "Rotation"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "element_id"
  ],
  "title": "TransformElementParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of transforming an element",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the transformed element",
      "title": "Element Id",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "element_id",
    "message"
  ],
  "title": "TransformElementResult",
  "type": "object"
}

# update_element_style write

Update text, paragraph, or shape styling on an element and return the applied style changes.

Full description
Update the style of a page element -- text formatting, paragraph layout,
or shape properties.

For text elements: set fontSize, font_family, bold, italic, colors, etc.
Specify start_index/end_index to format a specific range, or omit both
to format all text in the element.

For paragraph formatting: set alignment, line spacing, indentation.
These apply to all paragraphs that overlap the specified text range.

For shape properties: set fill color, transparency, outline.

All parameters are optional -- only provided ones are updated. Multiple
categories (text style, paragraph style, shape properties) can be updated
in a single call.

Args:
    presentation_id: ID of the presentation
    element_id: ID of the element to update
    start_index: Start of text range (0-based). Omit for all text.
    end_index: End of text range. Omit for all text.
    font_size_pt: Font size in points
    font_family: Font family name (e.g., "Arial", "Montserrat")
    bold: Whether text should be bold
    italic: Whether text should be italic
    underline: Whether text should be underlined
    strikethrough: Whether text should be struck through
    text_color: Text foreground color as hex
    link_url: URL to link the text to
    alignment: Paragraph alignment (LEFT, CENTER, RIGHT, JUSTIFIED)
    line_spacing: Line spacing as percentage (100 = single, 150 = 1.5x)
    space_above: Space above paragraph in points
    space_below: Space below paragraph in points
    indent_start: Start indentation in points
    indent_first_line: First line indentation in points
    fill_color: Shape fill color as hex
    fill_alpha: Shape fill transparency (0.0-1.0)
    outline_color: Shape outline color as hex
    outline_weight: Outline thickness in points
    outline_visible: Whether outline is rendered

Returns:
    Confirmation with element ID and list of properties updated.

Example: {"presentation_id": "abc123", "element_id": "textbox_a1b2c3d4", "font_size_pt": 18, "bold": true, "text_color": "#FF6D3A", "alignment": "CENTER"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
element_id string Yes ID of the element to update
start_index integer | null No Start of text range (0-based). Omit for all text.
end_index integer | null No End of text range. Omit for all text.
font_size_pt number | null No Font size in points
font_family string | null No Font family name (e.g., 'Arial', 'Montserrat')
bold boolean | null No Whether text should be bold
italic boolean | null No Whether text should be italic
underline boolean | null No Whether text should be underlined
strikethrough boolean | null No Whether text should be struck through
text_color string | null No Text foreground color as hex
link_url string | null No URL to link the text to
alignment string | null No Paragraph alignment: LEFT, CENTER, RIGHT, JUSTIFIED
line_spacing number | null No Line spacing as percentage (100 = single, 150 = 1.5x)
space_above number | null No Space above paragraph in points
space_below number | null No Space below paragraph in points
indent_start number | null No Start indentation in points
indent_first_line number | null No First line indentation in points
fill_color string | null No Shape fill color as hex
fill_alpha number | null No Shape fill transparency (0.0-1.0)
outline_color string | null No Shape outline color as hex
outline_weight number | null No Outline thickness in points
outline_visible boolean | null No Whether outline is rendered
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for updating element style",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the element to update",
      "title": "Element Id",
      "type": "string"
    },
    "start_index": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Start of text range (0-based). Omit for all text.",
      "title": "Start Index"
    },
    "end_index": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "End of text range. Omit for all text.",
      "title": "End Index"
    },
    "font_size_pt": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Font size in points",
      "title": "Font Size Pt"
    },
    "font_family": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Font family name (e.g., 'Arial', 'Montserrat')",
      "title": "Font Family"
    },
    "bold": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether text should be bold",
      "title": "Bold"
    },
    "italic": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether text should be italic",
      "title": "Italic"
    },
    "underline": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether text should be underlined",
      "title": "Underline"
    },
    "strikethrough": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether text should be struck through",
      "title": "Strikethrough"
    },
    "text_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Text foreground color as hex",
      "title": "Text Color"
    },
    "link_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "URL to link the text to",
      "title": "Link Url"
    },
    "alignment": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Paragraph alignment: LEFT, CENTER, RIGHT, JUSTIFIED",
      "title": "Alignment"
    },
    "line_spacing": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Line spacing as percentage (100 = single, 150 = 1.5x)",
      "title": "Line Spacing"
    },
    "space_above": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Space above paragraph in points",
      "title": "Space Above"
    },
    "space_below": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Space below paragraph in points",
      "title": "Space Below"
    },
    "indent_start": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Start indentation in points",
      "title": "Indent Start"
    },
    "indent_first_line": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "First line indentation in points",
      "title": "Indent First Line"
    },
    "fill_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Shape fill color as hex",
      "title": "Fill Color"
    },
    "fill_alpha": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Shape fill transparency (0.0-1.0)",
      "title": "Fill Alpha"
    },
    "outline_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Shape outline color as hex",
      "title": "Outline Color"
    },
    "outline_weight": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Outline thickness in points",
      "title": "Outline Weight"
    },
    "outline_visible": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether outline is rendered",
      "title": "Outline Visible"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "element_id"
  ],
  "title": "UpdateElementStyleParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of updating element style",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the updated element",
      "title": "Element Id",
      "type": "string"
    },
    "properties_updated": {
      "description": "List of property categories updated",
      "items": {
        "type": "string"
      },
      "title": "Properties Updated",
      "type": "array"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "element_id",
    "properties_updated",
    "message"
  ],
  "title": "UpdateElementStyleResult",
  "type": "object"
}

# update_paragraph_style write

Update paragraph-level formatting like alignment in a text element and return status.

Full description
Update paragraph-level properties like alignment for paragraphs within a text element.

Applies paragraph-level formatting to all paragraphs that are touched by the
specified text range. For example, setting the alignment will apply it to the
entire paragraph(s) containing the specified characters.

Args:
    presentation_id: ID of the presentation
    element_id: ID of the content element (e.g., a text box) to update
    start_index: The starting character index of a range within the target paragraph(s) (0-based)
    end_index: The ending character index of a range within the target paragraph(s)
    alignment: Text alignment to apply - LEFT, CENTER, RIGHT, JUSTIFIED

Returns:
    Status of the operation and success message.

Example: {"presentation_id": "abc123", "element_id": "textbox_a1b2c3d4", "start_index": 0, "end_index": 20, "alignment": "CENTER"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
element_id string Yes ID of the content element to update
start_index integer Yes Starting character index (0-based)
end_index integer Yes Ending character index
alignment string Yes Text alignment - LEFT, CENTER, RIGHT, JUSTIFIED
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for updating paragraph style",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the content element to update",
      "title": "Element Id",
      "type": "string"
    },
    "start_index": {
      "description": "Starting character index (0-based)",
      "title": "Start Index",
      "type": "integer"
    },
    "end_index": {
      "description": "Ending character index",
      "title": "End Index",
      "type": "integer"
    },
    "alignment": {
      "description": "Text alignment - LEFT, CENTER, RIGHT, JUSTIFIED",
      "title": "Alignment",
      "type": "string"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "element_id",
    "start_index",
    "end_index",
    "alignment"
  ],
  "title": "UpdateParagraphStyleParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of updating paragraph style",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "message"
  ],
  "title": "UpdateParagraphStyleResult",
  "type": "object"
}

# update_table_cell write

Update a table cell's text and styling, including borders or merges, and return the cell changes.

Full description
Update the content and styling of a table cell.

Can set text, background color, font properties, alignment, borders,
and cell merging. Only provided parameters are updated -- others remain
unchanged.

For batch styling (e.g., formatting all cells in a column), call this
tool multiple times or use the batch variant (future enhancement).

Args:
    presentation_id: ID of the presentation
    element_id: Table element ID from create_table
    row_index: 0-based row index
    column_index: 0-based column index
    text: New cell text content (replaces existing)
    fill_color: Cell background color as hex
    text_color: Text color as hex
    font_size_pt: Font size in points
    font_family: Font family name
    bold: Whether text should be bold
    italic: Whether text should be italic
    alignment: LEFT, CENTER, or RIGHT
    vertical_alignment: TOP, MIDDLE, or BOTTOM
    row_span: Merge cell down N rows (minimum 1)
    column_span: Merge cell across N columns (minimum 1)
    border_top: Top border spec with weight, color, dash
    border_bottom: Bottom border spec with weight, color, dash
    border_left: Left border spec with weight, color, dash
    border_right: Right border spec with weight, color, dash

Returns:
    Confirmation with cell coordinates

Example: {"presentation_id": "abc123", "element_id": "table_a1b2c3d4", "row_index": 1, "column_index": 0, "text": "Updated", "fill_color": "#E8F0FE", "bold": true}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
element_id string Yes Table element ID from create_table
row_index integer Yes 0-based row index
column_index integer Yes 0-based column index
text string | null No Replace cell text content
fill_color string | null No Cell background color as hex
text_color string | null No Text color as hex
font_size_pt number | null No Font size in points
font_family string | null No Font family name
bold boolean | null No Whether text should be bold
italic boolean | null No Whether text should be italic
alignment string | null No Horizontal text alignment: LEFT, CENTER, RIGHT
vertical_alignment string | null No Vertical content alignment: TOP, MIDDLE, BOTTOM
row_span integer | null No Merge this cell across N rows (minimum 1)
column_span integer | null No Merge this cell across N columns (minimum 1)
border_top BorderSpec | null No Top border spec
border_bottom BorderSpec | null No Bottom border spec
border_left BorderSpec | null No Left border spec
border_right BorderSpec | null No Right border spec
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "$defs": {
    "BorderSpec": {
      "description": "Border specification for table cells",
      "properties": {
        "weight": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": 1,
          "description": "Border weight in points",
          "title": "Weight"
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Border color as hex (e.g., '#000000')",
          "title": "Color"
        },
        "dash": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": "SOLID",
          "description": "Dash style: SOLID, DOT, DASH, DASH_DOT, LONG_DASH, LONG_DASH_DOT",
          "title": "Dash"
        }
      },
      "title": "BorderSpec",
      "type": "object",
      "additionalProperties": false
    }
  },
  "description": "Parameters for updating a table cell",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "element_id": {
      "description": "Table element ID from create_table",
      "title": "Element Id",
      "type": "string"
    },
    "row_index": {
      "description": "0-based row index",
      "title": "Row Index",
      "type": "integer"
    },
    "column_index": {
      "description": "0-based column index",
      "title": "Column Index",
      "type": "integer"
    },
    "text": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Replace cell text content",
      "title": "Text"
    },
    "fill_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Cell background color as hex",
      "title": "Fill Color"
    },
    "text_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Text color as hex",
      "title": "Text Color"
    },
    "font_size_pt": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Font size in points",
      "title": "Font Size Pt"
    },
    "font_family": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Font family name",
      "title": "Font Family"
    },
    "bold": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether text should be bold",
      "title": "Bold"
    },
    "italic": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether text should be italic",
      "title": "Italic"
    },
    "alignment": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Horizontal text alignment: LEFT, CENTER, RIGHT",
      "title": "Alignment"
    },
    "vertical_alignment": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Vertical content alignment: TOP, MIDDLE, BOTTOM",
      "title": "Vertical Alignment"
    },
    "row_span": {
      "anyOf": [
        {
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Merge this cell across N rows (minimum 1)",
      "title": "Row Span"
    },
    "column_span": {
      "anyOf": [
        {
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Merge this cell across N columns (minimum 1)",
      "title": "Column Span"
    },
    "border_top": {
      "anyOf": [
        {
          "$ref": "#/$defs/BorderSpec"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Top border spec"
    },
    "border_bottom": {
      "anyOf": [
        {
          "$ref": "#/$defs/BorderSpec"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Bottom border spec"
    },
    "border_left": {
      "anyOf": [
        {
          "$ref": "#/$defs/BorderSpec"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Left border spec"
    },
    "border_right": {
      "anyOf": [
        {
          "$ref": "#/$defs/BorderSpec"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Right border spec"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "element_id",
    "row_index",
    "column_index"
  ],
  "title": "UpdateTableCellParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of updating a table cell",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "row_index": {
      "description": "Row index of the updated cell",
      "title": "Row Index",
      "type": "integer"
    },
    "column_index": {
      "description": "Column index of the updated cell",
      "title": "Column Index",
      "type": "integer"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "row_index",
    "column_index",
    "message"
  ],
  "title": "UpdateTableCellResult",
  "type": "object"
}

# update_text_style write

Update character-level formatting for a text range in an element and return the applied text styles.

Full description
Update the style of a specific range of text in a content element.

Applies character-level formatting (like font, size, color, bold, or italic)
to a portion of text within an existing text box or shape.

Args:
    presentation_id: ID of the presentation
    element_id: ID of the content element (e.g., a text box) to update
    start_index: The starting character index of the text to format (0-based)
    end_index: The ending character index of the text to format
    font_size_pt: Optional font size in points
    font_family: Optional font family name
    bold: Optional boolean for bold styling
    italic: Optional boolean for italic styling
    underline: Optional boolean for underlined styling
    text_color: Optional hex color for the text

Returns:
    Status of the operation and success message.

Example: {"presentation_id": "abc123", "element_id": "textbox_a1b2c3d4", "start_index": 0, "end_index": 5, "bold": true, "text_color": "#FF0000"}
Parameter Type Required Description
presentation_id string Yes ID of the presentation
element_id string Yes ID of the content element to update
start_index integer Yes Starting character index (0-based)
end_index integer Yes Ending character index
font_size_pt integer | null No Font size in points
font_family string | null No Font family name
bold boolean | null No Whether text should be bold
italic boolean | null No Whether text should be italic
underline boolean | null No Whether text should be underlined
text_color string | null No Hex color for text
account string | null No Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.
Parameter schema (JSON)
{
  "description": "Parameters for updating text style",
  "properties": {
    "presentation_id": {
      "description": "ID of the presentation",
      "title": "Presentation Id",
      "type": "string"
    },
    "element_id": {
      "description": "ID of the content element to update",
      "title": "Element Id",
      "type": "string"
    },
    "start_index": {
      "description": "Starting character index (0-based)",
      "title": "Start Index",
      "type": "integer"
    },
    "end_index": {
      "description": "Ending character index",
      "title": "End Index",
      "type": "integer"
    },
    "font_size_pt": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Font size in points",
      "title": "Font Size Pt"
    },
    "font_family": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Font family name",
      "title": "Font Family"
    },
    "bold": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether text should be bold",
      "title": "Bold"
    },
    "italic": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether text should be italic",
      "title": "Italic"
    },
    "underline": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Whether text should be underlined",
      "title": "Underline"
    },
    "text_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Hex color for text",
      "title": "Text Color"
    },
    "account": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional Google account override (email). Pass the same account the presentation_id/element_id came from — IDs are scoped to the account they were created on, so calling with the default account when the ID came from a non-default account will fail. Omit to use the user's default Google account. Call list_accounts to see which accounts are connected.",
      "title": "Account"
    }
  },
  "required": [
    "presentation_id",
    "element_id",
    "start_index",
    "end_index"
  ],
  "title": "UpdateTextStyleParams",
  "type": "object",
  "additionalProperties": false
}
Result schema (JSON)
{
  "description": "Result of updating text style",
  "properties": {
    "status": {
      "description": "Status of the operation",
      "title": "Status",
      "type": "string"
    },
    "message": {
      "description": "Success message",
      "title": "Message",
      "type": "string"
    }
  },
  "required": [
    "status",
    "message"
  ],
  "title": "UpdateTextStyleResult",
  "type": "object"
}