From slides-suite
Generate a Google Slides presentation from any content — text, markdown, topic description, URL, or structured data. **AUTOMATICALLY INVOKE** when user says: - "make slides", "create slides", "create a presentation" - "turn this into a deck", "build a slide deck", "generate slides" - "present this", "presentation from this content"
How this skill is triggered — by the user, by Claude, or both
Slash command
/slides-suite:make-slidesclaude-sonnet-4-6This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You create Google Slides presentations from user-provided content, then
You create Google Slides presentations from user-provided content, then visually verify them with Chrome DevTools.
Accept content in any form:
Before structuring slides, identify 3–5 main themes in the content. Each theme becomes a section. This prevents the common mistake of mapping one paragraph to one slide.
| Position | Layout | Purpose |
|---|---|---|
| Slide 1 (cover) | auto | Deck title + subtitle/tagline |
| Slides 2–3 | TITLE_AND_BODY or SECTION_HEADER | Context / agenda |
| Middle slides | TITLE_AND_BODY, BIG_NUMBER, MAIN_POINT | Core content |
| Last slide | TITLE_AND_BODY | "Thank You / Questions" |
Default: 8–12 slides. Respect explicit count requests. Hard max: 20 slides.
| Slide content type | Layout to use |
|---|---|
| Normal content with 2–6 bullets | TITLE_AND_BODY (default) |
| Transition between sections | SECTION_HEADER |
| Single key metric or stat | BIG_NUMBER |
| Bold qualitative statement / quote | MAIN_POINT |
| Intentionally empty (for images added later) | BLANK |
TITLE_AND_BODY (default):
{ "title": "Why This Matters", "bullets": ["Reason A", "Reason B", "Reason C"], "notes": "..." }
SECTION_HEADER — title only, no bullets:
{ "layout": "SECTION_HEADER", "title": "Part 2: Results" }
BIG_NUMBER — title is the stat (rendered large), bullets[0] is the label below it:
{ "layout": "BIG_NUMBER", "title": "94%", "bullets": ["user satisfaction (Q4 2025)"], "notes": "Source: internal survey" }
MAIN_POINT — title is a short, bold statement filling the slide:
{ "layout": "MAIN_POINT", "title": "The future is APIs." }
The first item in slides[] (with no layout field) sets the cover subtitle text:
{ "title": "Tagline or author name — March 2026" }
Every slide gets 1–3 sentences of talking points:
These patterns map content types to the correct JSON representation.
Use paired SECTION_HEADER + TITLE_AND_BODY slides:
[
{ "layout": "SECTION_HEADER", "title": "Before" },
{ "title": "Current State", "bullets": ["Manual process", "3-day cycle time", "High error rate"] },
{ "layout": "SECTION_HEADER", "title": "After" },
{ "title": "Proposed State", "bullets": ["Automated", "2-hour cycle time", "Near-zero errors"] }
]
Two-column side-by-side layouts are not available via this API.
Use TITLE_AND_BODY with time-prefixed bullets:
{
"title": "Q1–Q4 2026 Roadmap",
"bullets": ["Q1: Foundation — infrastructure", "Q2: MVP — core features", "Q3: Scale — performance", "Q4: Expand — new markets"],
"notes": "Q2 is the critical milestone"
}
Visual timeline bars with connectors require manual editing in Slides.
Use MAIN_POINT for the quote; include attribution in notes (not on slide):
{
"layout": "MAIN_POINT",
"title": "\"The only way to do great work is to love what you do.\"",
"notes": "— Steve Jobs, Stanford 2005"
}
Or use TITLE_AND_BODY when attribution must be visible:
{
"title": "\"The only way to do great work is to love what you do.\"",
"bullets": ["— Steve Jobs, Stanford Commencement 2005"]
}
Numbered bullets, introduced by a SECTION_HEADER:
[
{ "layout": "SECTION_HEADER", "title": "How It Works" },
{
"title": "5-Step Process",
"bullets": ["1. Discover — identify the problem", "2. Define — scope requirements", "3. Design — prototype", "4. Develop — build and test", "5. Deploy — ship and measure"]
}
]
Flowchart diagrams with arrows cannot be created via this tool.
Use BIG_NUMBER:
{ "layout": "BIG_NUMBER", "title": "$2.4M", "bullets": ["annual cost savings from automation"], "notes": "Source: Finance Q4 report" }
Avoid table-like ASCII art — proportional fonts break alignment. Instead use a TITLE_AND_BODY slide with a note to add a real table manually:
{
"title": "Feature Comparison",
"bullets": ["API Access: Basic=No, Pro=Yes, Enterprise=Yes", "SSO: Basic=No, Pro=No, Enterprise=Yes", "SLA: Basic=None, Pro=99.9%, Enterprise=99.99%"],
"notes": "PRESENTER NOTE: Convert to a real Slides table for final version"
}
The GAS SlidesApp API cannot create:
Always note these in speaker notes when the user's intent requires them.
Call mcp__gas-mcp__create_presentation with:
title: the presentation titleslides: the structured array (first item = cover subtitle data)Capture the returned url and slideCount.
Verify the output matches intent. Chrome must be running with
--remote-debugging-port=9222. Check first:
list_pages → if error: skip verification, report URL only
Open the presentation
navigate_page → url from create_presentation result
Detect login redirect (before waiting for content)
evaluate_script → document.location.hostname
If result contains accounts.google.com:
→ Report "Chrome requires Google login to open this presentation"
→ Skip remaining verification steps
Wait for slide editor to load
wait_for → [data-slide-id] (data attribute on slide elements, more stable than class names)
timeout: 10s
Take a screenshot
take_screenshot
Count slides in DOM
evaluate_script → document.querySelectorAll('[data-slide-id]').length
Compare to slideCount from the MCP result. Report if they differ.
Get title from first slide
evaluate_script → document.querySelector('[data-slide-id]')?.textContent?.substring(0, 100)
Verify the presentation title is visible.
slideCount from create_presentation responsePresentation created: <url>
<N> slides — visual verification: PASS / FAIL / SKIPPED (Chrome not available)
If verification fails: describe the discrepancy and offer to regenerate.
| Error condition | Action |
|---|---|
create_presentation returns error | Show message; offer to output raw JSON for manual creation |
| Chrome not available | Create and report URL without visual check |
| Login redirect detected | Report URL; ask user to open Chrome with their Google account |
| Screenshot shows blank page | Retry: wait_for 5s, then take_screenshot again |
| Slide count mismatch | Report discrepancy and offer to regenerate |
| Input | Slides |
|---|---|
| Topic only | 8–10 |
| Short text (< 300 words) | 6–8 |
| Medium (300–1000 words) | 10–12 |
| Long (> 1000 words) | 12–18 |
| User-specified | Honor exactly (max 20) |
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub whichguy/claude-craft --plugin slides-suite