google-slides-mcp
A low-level Google Slides MCP server for reading decks, editing elements and text, reusing a styled template deck with full fidelity, and rendering slides to verify the result — every tool makes a bounded number of API calls and returns trimmed output.
Create & read decks —
create_presentation,get_presentation(bounded summary orraw, optionalinclude_mastersfor layouts/masters),get_page(one slide),list_slides(lightest index/id/layout list).Raw write power —
batch_updateapplies any SlidesbatchUpdaterequests (e.g.createSlide,createShape,insertText,updateTextStyle,updatePageElementTransform,duplicateObject) atomically in 1 call, returningrepliesandwarnings.Position / transform / stacking —
set_element_box(place/size by top-left in points, no matrix math),update_transform(raw AffineTransform, ABSOLUTE or RELATIVE),set_z_order(front/back),group_elements/ungroup_elements.Text editing —
replace_all_text(fill{{placeholder}}tokens, optionally per-page),insert_textat a character index,set_element_text(replace a whole shape's or table cell's text in one batch).Template / showcase reuse —
copy_presentation(Drivefiles.copy, preserving masters, layouts, theme and colors),catalog_slides(pick which example slide to reuse),duplicate_slide(full-fidelity in-deck copy),delete_objects(prune),reorder_slides.Palette workflow —
park_slideshides examples so they stay available as clone sources across turns,unpark_slidesrestores them,prune_parked_slidesdeletes all hidden slides as final cleanup.Rendering & verification —
render_pagerenders a slide to PNG (expensive quota op),diff_pagesrenders two slides and returns a normalized pixel mismatch ratio plus a diff image.Predictable cost — tools cost 1–2 API calls each (e.g.
set_element_box≤2,prune_parked_slides≤2,diff_pages2 expensive calls), with output trimmed to a finite budget.
Note: the README also describes Drive discovery (search_presentations, import_presentation) and review-comment tools (list_comments, add_comment, reply_to_comment, delete_comment), but those are not present in this server schema.
Used for copying entire presentations (preserving masters, layouts, theme) via the Drive files.copy API as part of the template reuse workflow.
Provides low-level tools for reading, creating, editing Google Slides presentations, manipulating slides and elements, rendering slides to PNG, and high-fidelity template reuse.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@google-slides-mcp Copy my template 'Sales Deck' and replace all text with Q3 figures."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
google-slides-mcp
A uvx-runnable MCP server for low-level
interaction with the Google Slides API.
It is built to be more capable than typical Slides MCPs. In addition to reading presentations and slides as structured objects, it can:
Find existing presentations in your Drive — native Google Slides and PowerPoint (
.pptx) files — by name, content, or recency ("the last deck I created"), and import a.pptxas a native Slides deck so every other tool works on it.Reuse a "model template" / showcase deck with full fidelity. Copy a styled showcase deck, duplicate the example slides you want (e.g. a 3‑column layout), fill them with content, and prune the rest — leaving a result functionally identical to hand‑editing the showcase (masters, layouts, theme and colors are all preserved).
Edit element bounding boxes in points (position/size) without doing affine matrix math, plus raw transform / z‑order / grouping control.
Render slides to PNG and diff two renders so you can verify output is pixel‑perfect.
Work with review comments. See exactly where every comment thread sits — a slide, an element, a range of text, table cells or the speaker notes — reply to and resolve them, and leave anchored comments to propose a change without editing (Slides has no suggestion mode). Text edits through
set_element_textchange only the words that differ, so comments on the rest stay attached.Issue raw
batchUpdaterequests for anything the convenience tools don't cover, optionally guarded by the revision you read.
Every tool makes a bounded number of API calls and returns trimmed output, so an LLM driving it has a predictable, finite cost.
Why the template workflow works this way
The Google Slides API has no native cross‑presentation slide copy.
duplicateObject only works within one presentation, and recreating a slide's
elements by hand in another deck loses fidelity (placeholder inheritance, master
styling and theme colors are dropped).
The high‑fidelity pattern this server implements is:
copy_presentation→ Drivefiles.copyclones the entire showcase deck, preserving masters, layouts, theme and color scheme.catalog_slides→ summarize the example slides so you can pick one per section.duplicate_slide→ copy a chosen example slide within the new deck (full fidelity).replace_all_text/set_element_box→ fill content and adjust layout.delete_objects→ prune the original showcase example slides.render_page/diff_pages→ verify the result.
Related MCP server: google-slides-mcp
1. Google Cloud Console setup (one time)
Go to the Google Cloud Console and create a project (or select an existing one).
Enable the APIs: APIs & Services → Library → enable both Google Slides API and Google Drive API.
Configure the OAuth consent screen: APIs & Services → OAuth consent screen.
User type: External (or Internal if you're in a Workspace org).
Fill in app name / support email.
Add the scopes
.../auth/presentationsand.../auth/drive.Under Test users, add the Google account you'll authorize with.
⚠️ While the app is in Testing status, refresh tokens expire after 7 days. Re-run the auth command when that happens, or publish the app.
Create credentials: APIs & Services → Credentials → Create credentials → OAuth client ID.
Application type: Desktop app.
Download the JSON — this is your
client_secret.json.
Scope note: this server requests the broad
auth/drivescope so it canfiles.copyany template you own by ID. If you only ever copy decks the app itself created, you can narrow this viaGOOGLE_SLIDES_SCOPES(see below), but the showcase workflow on existing decks needsauth/drive. Google requires the fully‑qualified scope URLs (e.g.https://www.googleapis.com/auth/drive); the short namespresentations/driveare accepted and expanded for you.
2. Install & first‑time login
Auth uses a standard interactive OAuth 2.0 installed‑app flow built to roll out to a team: you distribute one Desktop OAuth client JSON, and each person logs in once in a browser to cache their own personal refresh token. There is no shared, single‑user token.
You can authorize either way:
Option A — let the server do it (zero extra commands). Just configure the MCP server (next section) with your client secret. The first launch opens a browser for consent automatically and caches the token; every launch after that is silent.
Option B — log in explicitly up front (recommended for headless/server hosts, or to authorize before wiring up your MCP client):
GOOGLE_CLIENT_SECRET=/absolute/path/to/client_secret.json \
uvx --from git+https://github.com/justparent/google-slides-mcp google-slides-mcp-authEither way the token is written to ~/.config/google-slides-mcp/token.json
(override with GOOGLE_TOKEN_PATH / TOKEN_PATH). Once published to PyPI you'll be
able to drop --from … and just run uvx google-slides-mcp-auth.
If you're deploying somewhere without a browser, set
GOOGLE_SLIDES_NO_BROWSER_AUTH=1so the server never tries to open one, and use Option B to authorize ahead of time.
3. Configure your MCP client
Add the server to Claude Desktop / Claude Code (mcpServers config):
{
"mcpServers": {
"google-slides": {
"command": "uvx",
"args": [
"--from", "git+https://github.com/justparent/google-slides-mcp",
"google-slides-mcp"
],
"env": {
"GOOGLE_CLIENT_SECRET": "/absolute/path/to/client_secret.json",
"GOOGLE_TOKEN_PATH": "~/.config/google-slides-mcp/token.json"
}
}
}
}After PyPI publication: "args": ["google-slides-mcp"].
Environment variables
Variable | Default | Purpose |
|
| Path to the Desktop OAuth client JSON. |
|
| Where this user's cached token is stored (must be writable). |
|
| Comma‑separated scope override (advanced). Short names or full |
| unset | Set to |
The
GOOGLE_*names and the shorter aliases (CREDENTIALS_PATH/TOKEN_PATH) are interchangeable; if both are set, theGOOGLE_*name wins.
Tools
Find / import (Drive discovery)
Tool | Purpose | API calls |
| Find existing Google Slides and PowerPoint files in Drive. | 1 |
| Convert a Drive | 1 |
The Slides API has no listing endpoint, so discovery goes through Drive.
search_presentationscovers native decks and PowerPoint files; results flagdirectlyEditableso you know when animport_presentationconversion is needed first. Recipes: last deck I created →order_by="createdTime desc", owned_by_me=true, max_results=1; find the corporate template →name_contains="corporate template".
Core read
Tool | Purpose | API calls |
| Create an empty deck. | 1 |
| Bounded structured overview of a deck, with open-comment counts. | 1 |
| Bounded summary of one slide. | 1 |
| Minimal index/id/layout list, with open-comment counts. | 1 |
Raw write
Tool | Purpose | API calls |
| Apply raw Slides | 1 |
Element / transform / bounding box
Tool | Purpose | API calls |
| Place/size a box in points. | ≤2 |
| Apply a raw AffineTransform. | 1 |
| Reorder front/back stacking. | 1 |
| Group/ungroup elements. | 1 |
Text
Tool | Purpose | API calls |
| Fill placeholder tokens. | 1 |
| Insert text into a shape/cell. | 1 |
| Make one shape's (or table cell's) text exactly | 2 |
Review comments
Tool | Purpose | API calls |
| Comment threads ( | 1 |
| Start a thread on a slide, an element, quoted text, table cells or speaker notes. | 1–2 |
| Reply, and/or | 1 |
| Delete a thread, or one reply. | 1 |
Template / showcase reuse
Tool | Purpose | API calls |
| Clone a deck preserving full styling. | 1 |
| Per‑slide descriptor (incl. | 1 |
| Full‑fidelity in‑deck slide copy. | 1 |
| Delete slides/elements (prune). | 1 |
| Move slides. | 1 |
Iteration / palette
Tool | Purpose | API calls |
| Hide slides (skip) to keep them as a clone source. | 1 |
| Unhide parked slides. | 1 |
| Delete all parked slides — final cleanup. | ≤2 |
Rendering / verification
Tool | Purpose | API calls |
| Render a slide to PNG. | 1 (expensive) |
| Render two slides + pixel diff. | 2 (expensive) |
render_page/diff_pagesuse the thumbnail endpoint, an expensive quota operation (300/min per project, 60/min per user). Rendering is per‑page by design — there is no whole‑deck render.
Example: build a deck from a showcase template
copy_presentation(source_id="<showcase_id>", title="Q3 Review") → new deck id
catalog_slides(presentation_id="<new_id>") → pick example slides
duplicate_slide(presentation_id="<new_id>", page_id="<3col_example>", insertion_index=1)
replace_all_text(presentation_id="<new_id>", mappings={"{{title}}": "Results"})
delete_objects(presentation_id="<new_id>", object_ids=["<original_examples>..."])
render_page(presentation_id="<new_id>", page_id="<new_slide>") → verify visually
diff_pages(presentation_id="<new_id>", page_a="<new_slide>", page_b="<showcase_example>")Example: port your latest deck into the corporate template
search_presentations(order_by="createdTime desc", owned_by_me=true, max_results=1)
→ the source deck (or .pptx)
import_presentation(file_id="<source_id>") → only if the source is a .pptx
search_presentations(name_contains="corporate template", file_type="google_slides")
→ the template deck
copy_presentation(source_id="<template_id>", title="Q3 Review (rebranded)")
catalog_slides(presentation_id="<source_id>") → read the source content
catalog_slides(presentation_id="<new_id>") → pick matching template layouts
duplicate_slide / set_element_text / replace_all_text → rebuild each slide on-brand
render_page(presentation_id="<new_id>", page_id="<slide>") → verifyIterative / palette workflow
You do not have to assemble the deck in one shot. Every tool is an independent call, so you can keep adding slides across many turns ("great, now add another three‑column slide that says xyz").
The key idea is a palette: because the Slides API can only duplicate slides
within one deck, keep the showcase example slides present in the working deck as
reusable sources, and duplicate from them on demand. park_slides hides them
(skips them in present mode) so they don't clutter the in‑progress deck, and
prune_parked_slides removes them all at the very end.
# Once, at the start of a project:
copy_presentation(source_id="<showcase_id>", title="Q3 Review") → working deck (palette embedded)
park_slides(presentation_id="<new_id>", slide_ids=[<all example ids>]) → hide the palette
# Repeat any number of times, across separate turns:
catalog_slides(presentation_id="<new_id>") → find the 3‑column example id (isSkipped=true)
duplicate_slide(presentation_id="<new_id>", page_id="<3col_example>") → new live slide
set_element_text(presentation_id="<new_id>", element_id="<col1>", text="xyz")
# ...or replace_all_text(..., page_ids=["<new_slide>"]) if the example uses {{tokens}}
render_page(presentation_id="<new_id>", page_id="<new_slide>") → verify
# Once, at the end (the skill's responsibility):
prune_parked_slides(presentation_id="<new_id>") → delete the paletteWhy park instead of delete?
park_slideskeeps every layout available as a clone source for later turns. If youdelete_objectsan example early, a layout you never instantiated is gone from the deck (there is no cross‑deck copy).
Fallback: recreating a layout
If a needed layout was already pruned, you can rebuild a slide from the deck's
layouts (visible via get_presentation(..., include_masters=True)) using
createSlide with a slideLayoutReference, plus createShape/createImage via
batch_update. This reproduces a layout's placeholders faithfully, but
recreating an arbitrary slide's elements this way is not guaranteed
pixel‑perfect — theme colors, master styling and placeholder inheritance can be
lost. Prefer keeping the palette parked.
Review comments
Reviewers leave comments on slides; these tools let an assistant read them in place, act on them and answer. Slides has no suggestion mode, so a comment is also how an assistant proposes or flags a change without editing the slide.
get_presentation(presentation_id="<deck>")
→ comments: {open: 3, resolved: 1, orphaned: 0}, and openComments on each slide
list_comments(presentation_id="<deck>")
→ every open thread: content, replies, the quote it was made on, and where it sits
set_element_text / replace_all_text / batch_update → make the change it asks for
reply_to_comment(presentation_id="<deck>", comment_id="<id>",
content="Changed to 14%.", action="resolve")
add_comment(presentation_id="<deck>", content="Source for this number?", text="14%")
→ flag something without touching the slideWhere a comment sits. Each location in list_comments has a kind: slide,
element (a whole shape, image or table), text (a range in a shape, with the
words it covers), table_cells (cells, each with its range) or notes (speaker
notes), plus slideId and slideIndex. add_comment takes the same:
To comment on… | Pass |
a slide |
|
a shape, image or table |
|
some words |
|
a table cell, or words in it |
|
a block of cells |
|
the speaker notes |
|
Worth knowing
Reading comments needs comment access to the deck. The overviews (
get_presentation,get_page,list_slides) use Google's "current access" mode, which (per its documentation) leaves comments out rather than failing for a view-only user;list_commentsreports the error instead.A thread whose commented content was deleted stays open but has no location: it is flagged
orphanedand keeps itsquote.set_element_textandreplace_all_textkeep comments attached to the words they leave in place, and to a phrase that is replaced; deleting a shape, or deleting and retyping text through raw requests, detaches them.Every comment write bumps the deck's
revisionId. To guard an index-based edit, pass therevisionIdyou last saw asrequired_revision_idtobatch_update; every write returns the new one.duplicate_slideputs a text-range thread on the copy as well (one thread, two locations). Drivefiles.copy(copy_presentation) does not copy comments.Assignees and @mentions are not exposed because they notify people;
batch_updateacceptsinsertCommentwithassigneeEmailAddressif you need one.Needs
google-api-python-client2.201.0 or newer (older releases don't know the comments parameters). No new OAuth scope is needed.
Development
uv venv && uv pip install -e ".[dev]"
uv run pytest # unit + smoke tests (no network/credentials)
uv build # build sdist + wheelA ready-to-use Claude skill describing the canonical workflow lives at
example_skill/SKILL.md.
The codebase is intentionally small and modular so it can back that skill:
Module | Responsibility |
| OAuth installed‑app flow, token cache, login CLI. |
| Builds Slides/Drive services; bounded 429/5xx backoff. |
| EMU/PT conversion, transform & bounding‑box math. |
| Trims verbose API responses into bounded summaries. |
| Comment threads and their anchors: read them, locate quoted text, write them. |
| Minimal text edits that keep comment anchors attached. |
| Collision‑safe object‑ID generation. |
| Copy / catalog / duplicate / prune helpers. |
| Drive search over Slides/PPTX files; PPTX → Slides import. |
| Thumbnail rendering + Pillow image diff. |
| FastMCP server wiring the tools together. |
Troubleshooting
"No cached Google credentials …" — run
google-slides-mcp-authfirst.Token stopped working after ~7 days — your OAuth app is in Testing status; re-run the auth command or publish the consent screen.
insufficient scopes/ can't copy a template — ensure theauth/drivescope is granted (re-run auth after enabling it on the consent screen).unexpected keyword argument 'commentsViewMode'—google-api-python-clientis older than 2.201.0; upgrade it.No module named 'mcp.server.fastmcp'— mcp 2.x was installed, which renamed that module. This server needsmcp<2(the package metadata now says so)."Access blocked: Authorization Error" /
Error 400: invalid_scope(Some requested scopes were invalid) — the scopes sent weren't fully‑qualified URLs. Use the fullhttps://www.googleapis.com/auth/...form (or the short namespresentations/drive, which are now expanded for you) inGOOGLE_SLIDES_SCOPES.
License
MIT — see LICENSE.
Available Tools
23 toolsbatch_updateA
Apply raw Slides batchUpdate requests atomically. (1 API call.)
This is the low-level power tool: requests is a list of Slides API request
objects (e.g. createSlide, insertText, createShape,
updateTextStyle, updatePageElementTransform, duplicateObject ...).
See https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/request
Many edits batched into one call still cost a single write quota unit.
Note: updateShapeProperties/updateTextStyle/updatePageProperties
require a fields mask; a missing mask is reported as a warning.
Args: presentation_id: The presentation ID. requests: A list of single-key Slides request objects.
Returns:
{replies, warnings} where replies is the API response array.
Inputs: presentation_id (required), requests (required). Returns: object
catalog_slidesA
Summarize each slide (layout, element makeup, placeholders, title). (1 call.)
Use after copy_presentation to choose which showcase example slide to reuse
for each section of the new deck.
Inputs: presentation_id (required). Returns: result
copy_presentationA
Clone an entire deck (Drive files.copy), preserving full styling. (1 call.)
The starting point of the high-fidelity template workflow: copies the showcase deck with all masters, layouts, theme and color scheme intact, so the copy can be edited exactly as if you were editing the showcase itself.
Args: source_id: The presentation ID of the template/showcase to copy. title: Title for the new copy. parent_folder_id: Optional Drive folder to place the copy in.
Inputs: source_id (required), title (required), parent_folder_id. Returns: object
create_presentationA
Create a new, empty Google Slides presentation. (1 API call.)
Args: title: The title for the new presentation.
Returns:
{presentationId, title, url}.
Inputs: title (required). Returns: object
delete_objectsA
Delete slides or page elements by ID. (1 API call.)
Use to prune the original showcase example slides after duplicating the ones you want.
Inputs: presentation_id (required), object_ids (required). Returns: object
diff_pagesA
Render two slides and report their pixel difference. (2 expensive calls.)
Renders both pages, computes a normalized mismatch ratio in [0, 1] (0 = pixel identical), and returns a visual diff image highlighting changed regions. Useful to verify a duplicated/edited slide matches the showcase original.
Returns a text summary followed by the diff PNG.
Inputs: presentation_id (required), page_a (required), page_b (required), size. Returns: result
duplicate_slideA
Duplicate a slide within a deck with full fidelity. (1 API call.)
Copies all of the slide's elements and inherited styling. Use it to instantiate
a showcase example slide for a new section, then fill it with replace_all_text.
Args: presentation_id: The presentation ID. page_id: The slide to duplicate. insertion_index: Where to place the duplicate (optional).
Inputs: presentation_id (required), page_id (required), insertion_index. Returns: object
get_pageA
Get a single page (slide) as a bounded summary. (1 API call.)
Args: presentation_id: The presentation ID. page_id: The page (slide) object ID. raw: Return the full, untrimmed API response instead of the summary.
Inputs: presentation_id (required), page_id (required), raw. Returns: object
get_presentationA
Get a presentation as a bounded, structured overview. (1 API call.)
By default returns a trimmed summary (slides, elements, positions, short text snippets) so large decks stay within a finite output budget.
Args: presentation_id: The presentation ID. include_masters: Also summarize layouts and masters. raw: Return the full, untrimmed API response instead of the summary.
Inputs: presentation_id (required), include_masters, raw. Returns: object
group_elementsC
Group two or more elements into a single group. (1 API call.)
Inputs: presentation_id (required), element_ids (required). Returns: object
insert_textB
Insert text into a shape or table cell at a character index. (1 API call.)
Inputs: presentation_id (required), element_id (required), text (required), index. Returns: object
list_slidesA
List slides with index, id, and layout reference only. (1 API call.)
The lightest-weight read — use it to find slide IDs before deeper calls.
Inputs: presentation_id (required). Returns: result
park_slidesA
Hide slides (mark skipped) so they stay as a clone source. (1 API call.)
Keeps the showcase example/original slides in the deck as a reusable "palette"
while hiding them from presentation mode. Duplicate from them across as many
turns as you like, then prune_parked_slides at the very end.
Inputs: presentation_id (required), slide_ids (required). Returns: object
prune_parked_slidesA
Delete every parked (hidden/skipped) slide — final cleanup. (<=2 API calls.)
Removes ALL slides currently marked skipped, so use it deliberately as the last step once the deck is assembled.
Inputs: presentation_id (required). Returns: object
render_pageA
Render a slide to a PNG image for visual verification. (1 expensive call.)
Returns the server-side rendered pixels of the slide — the same image a viewer sees — so you can confirm output looks correct. Rendering is per-page by design (the thumbnail endpoint is an expensive quota operation).
Args: presentation_id: The presentation ID. page_id: The slide object ID. size: LARGE (~1600px), MEDIUM (~800px), or SMALL (~200px) wide.
Inputs: presentation_id (required), page_id (required), size.
reorder_slidesA
Move a block of slides to a new position. (1 API call.)
Inputs: presentation_id (required), slide_ids (required), insertion_index (required). Returns: object
replace_all_textA
Replace all occurrences of each placeholder string. (1 API call.)
The primary content-fill tool for the template workflow: map showcase placeholder text to real content. All replacements run in one batch.
Args:
presentation_id: The presentation ID.
mappings: {find: replace} pairs.
page_ids: Restrict to these pages (optional; default = whole deck).
match_case: Case-sensitive matching.
Inputs: presentation_id (required), mappings (required), page_ids, match_case. Returns: object
set_element_boxA
Set an element's position (and optionally size) in points. (Up to 2 calls.)
A convenience over updatePageElementTransform that lets you place a
bounding box by its top-left corner in points without computing an affine
matrix. Reads the element's current transform once (to preserve scale/shear
when size is omitted), then applies one absolute transform update.
Args: presentation_id: The presentation ID. element_id: The page element to move/resize. x_pt: Left edge (top-left X) in points. y_pt: Top edge (top-left Y) in points. width_pt: Desired visual width in points (optional; preserves current if omitted). height_pt: Desired visual height in points (optional; preserves current if omitted).
Inputs: presentation_id (required), element_id (required), x_pt (required), y_pt (required), +2 more. Returns: object
set_element_textA
Replace ALL of a shape's (or table cell's) text in one call. (1 API call.)
Clears the element's existing text and sets it to text in a single batch
(deleteText + insertText). Safe to call on an empty element. This is the
ergonomic way to fill a freshly duplicated slide when the showcase example uses
real text rather than {{placeholder}} tokens.
Args: presentation_id: The presentation ID. element_id: The shape or table-cell object ID. text: The new full text content.
Inputs: presentation_id (required), element_id (required), text (required). Returns: object
set_z_orderC
Change the front/back stacking order of elements. (1 API call.)
Inputs: presentation_id (required), element_ids (required), operation (required). Returns: object
ungroup_elementsB
Ungroup one or more groups back into individual elements. (1 API call.)
Inputs: presentation_id (required), group_ids (required). Returns: object
unpark_slidesC
Unhide slides previously parked (mark not skipped). (1 API call.)
Inputs: presentation_id (required), slide_ids (required). Returns: object
update_transformA
Apply a raw AffineTransform to an element. (1 API call.)
Args:
presentation_id: The presentation ID.
element_id: The page element ID.
transform: An AffineTransform dict (scaleX, scaleY, shearX, shearY,
translateX, translateY, unit). unit may be EMU or PT.
mode: ABSOLUTE (replace) or RELATIVE (multiply with existing).
Inputs: presentation_id (required), element_id (required), transform (required), mode. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 23 tools
Each tool targets a specific, clearly distinct operation – from slide duplication to text replacement to element grouping – with no overlapping purposes. The only potential ambiguity (batch_update vs. individual tools) is resolved by batch_update being explicitly the low-level catch-all.
All 23 tools follow a consistent verb_noun snake_case pattern (e.g., duplicate_slide, replace_all_text, park_slides). No mixing of camelCase or other conventions, making the naming predictable and easy to remember.
23 tools is on the higher end but appropriate for a comprehensive Google Slides wrapper that covers presentation, slide, element, text, and rendering operations. Slightly above the ideal 3-15 range but each tool serves a distinct purpose.
The tool set covers core CRUD and common workflows like template reuse (copy, duplicate, park, prune, replace). Some operations (e.g., shape/image creation) are only accessible via batch_update, which introduces a minor gap for direct high-level tools.
Related MCP Connectors
Create, edit, export and manage presentations. Requires a paid PPT.AI API merchant account.
Read and update slide text and structure in owned AppStruct presentations.
Create, edit, preview, and share Slides.com presentations. Requires a paid Slides.com account.
Turn slide images, charts and screenshots into editable PowerPoint (PPTX) or SVG files.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables interaction with Google Slides presentations through OAuth2 authentication. Supports creating new slides, adding rectangles, and managing presentation content through natural language commands.6MIT
- AlicenseNot gradedqualityDmaintenanceEnables creating, reading, and modifying Google Slides presentations programmatically via natural language through the Model Context Protocol.41 npm191MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to create, read, and modify Google Slides, Sheets, Docs, and Drive documents programmatically. Supports file management, content editing, and version history retrieval.1,276 npmMIT
- AlicenseAqualityBmaintenanceEnables AI assistants to build and edit Google Slides presentations through natural language, including managing slides, text, shapes, images, tables, speaker notes, comments, thumbnails, and exporting to PDF or PPTX.32412 npm1MIT