Sd create deck
Skill SimplerDevelopment/simplerdevelopment-skills/sd-create-deck
Claude Code skills for the SimplerDevelopment.com portal — draft pages, decks, emails, surveys, and full websites via MCP, all human-in-the-loop.
npx -y skills add SimplerDevelopment/simplerdevelopment-skills --skill sd-create-deckAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Draft a pitch deck (presentation, slideshow, sales deck, investor deck) in the SimplerDevelopment portal via the SimplerDevelopment MCP. Produces a multi-slide V2 deck applying the default brand profile, reuses existing block_templates as slide layouts, and returns a shareable approval URL for stakeholder review before publish. Sourcing material is optional and user-driven: the user's prompt, an external URL, a pasted brief, or a local file. Use when the user says 'draft a deck about X', 'create a pitch deck for Y', 'make a presentation on Z', 'build a sales deck for W', 'investor deck'. Default mode publishes a DRAFT (`status: draft`); requires a sd-init `.sd/config.json`.
SKILL.md
10.2 KB, as published. Nobody here has run it
sd-create-deck
Draft a pitch deck in the portal. The deck is created in draft status with slide-level drafts, an approval link is minted, and the URL is handed back so the author can share it with a reviewer.
Pre-flight
- Read
.sd/config.json— confirmclient,defaultSiteId,brand. If missing/stale, ask the user to runsd-initfirst. - Read brand messaging. This skill leans on
brand.messaging.tagline,valueProposition,keyDifferentiators,targetAudience,boilerplateheavily — the cover and section breaks are almost entirely brand-driven. - Read
SD_DESIGN_PRINCIPLES.md— apply the design + a11y + 8pt-grid rules. Deck-specific tweaks live in section 10 of that doc (24px+ body, 60–120px titles, one concept per slide, dark/light alternation for visual rhythm, speaker notes on every slide). - Read
.sd/learnings.mdif present — apply## Active rules. - READ the
blocks://schemaMCP resource before authoring slides. Slide blocks use the visual-editor schema with extra slide-specific affordances (per-slidecustomCss,pageSettings,notes).
Sourcing — ASK if unclear
Same options as sd-create-page:
prompt-only— write from prompt + brand voice (most common for "make me a sales deck about X").url— fetch one or more URLs (case study, white paper, blog post) and structure the deck around it.brief— read a local markdown/txt brief.mixed— combine.
Do not silently add private/internal sources. Client-facing decks should be grounded only in the user's prompt, files they provide, URLs they provide, and the tenant's own SimplerDevelopment MCP data.
Slide planning
Decide on the deck's spine before authoring any blocks. A typical deck has 6–14 slides. Common spine patterns:
- Sales pitch (8–10 slides): cover → problem → solution → how it works → social proof → pricing → outcome → CTA → next steps.
- Investor (10–14 slides): cover → mission → problem → market → product → traction → business model → team → ask → contact.
- Capabilities (6–8 slides): cover → services → process → case studies → team → CTA.
Pick the spine, list the slides, then author one slide at a time.
Authoring each slide
-
Reuse before invent. Check
.sd/config.json:inventory.blockTemplatesfor templates withscope: 'block'andcategorymatchingdeck/slide/hero/cta. If a slide layout has a template, compose from it. -
Slide block discipline (from the SD MCP tool docs):
- Use
headingblocks with explicitlevelfor titles, never a big styledtextblock. - Pair every heading with a small uppercase eyebrow
textblock above it for the branded feel. - Populate hero blocks fully:
title+subtitle+description+ctaText+ctaLink. Title-only heroes look broken at slide scale. - Apply
style(color, fontSize, fontWeight, letterSpacing) for visual hierarchy.
- Use
-
Per-slide affordances:
label— short slide name shown in the editor (e.g. "Cover", "Problem", "CTA"). Always set this.notes— speaker notes; useful for the presenter view. Add when slide concept is non-obvious.pageSettings.backgroundColor/pageSettings.color— slide-wide overrides; useful for "dark section break between content sections".customCss— only for genuinely custom slides; do not lean on this as a substitute for proper block styling.
-
Brand theme inheritance. Do NOT pass a
themeargument todecks_createunless the user explicitly says "use different colors than my brand". The MCP tool auto-inherits from the client's default branding profile. -
Logos by default. From
.sd/config.json:brand.logos:- Cover slide: the wide
logoUrlcentered above the eyebrow, height 56–96px. If onlylogoTextexists, render as styled small-uppercase wordmark. - Content slides: the icon
logoIconUrl(orlogoSquareUrl) bottom-right at 32px. Skip entirely on dark section-break slides where the icon would clash. Don't repeat the wide logo on every slide — it's noise. - Closing slide: wide
logoUrlagain, smaller (40–48px), bottom-center with the contact info.
- Cover slide: the wide
-
Contrast check on every slide. Per-slide
pageSettings.backgroundColor+pageSettings.colormust pass WCAG-AA. Callbranding_check_contraston the pair. Dark-bg slides need the body text near-white (#F8FAFC, not pure white — pure white on near-black causes shimmer). Light-bg slides need body text near-black (#0F172A). -
Embed related artifacts only when they fit the deck's job. Decks are usually self-contained narratives — but a sales deck CAN end with a
bookingblock on the close slide (so the prospect can book a call without leaving the deck), or asurveyblock on a section break (qualification mid-pitch). Use sparingly; most decks don't need embedded widgets.
MCP calls
Two-step:
-
Create the deck with
mcp__simplerdevelopment__decks_create:{ "title": "<deck title>", "description": "<one-line summary>", "sourceUrl": "<optional: url the deck was built from>" }The response includes the new deck's
idand anapprovalenvelope. The deck is still empty after this call — slides come next. -
Replace slides in one shot with
mcp__simplerdevelopment__decks_replace_slides. Preferred overdecks_add_slide(one round-trip, all slides) unless you're incrementally appending to an existing deck:{ "id": <deck id from step 1>, "slides": [ { "id": "cover", "label": "Cover", "blocks": [...], "notes": "...", "pageSettings": { "backgroundColor": "..." } }, ... ] }Each slide id should be a short stable string (
cover,problem,solution-1,cta). Slides land in slide drafts — the public renderer still shows the old slides untildecks_publish_allruns. -
Optional: publish all slides with
decks_publish_allif you want the draft slides to be immediately viewable. For a review-first workflow, skip this — the approval URL renders draft slides directly, anddecks_publish_allgets called automatically when the approver approves.
MCP response handling — read errors first
SimplerDevelopment's MCP wraps every response — successes AND errors — in a JSON-RPC success envelope shaped like:
{"result":{"content":[{"type":"text","text":"{...JSON...}"}]}}
Before reporting success to the user, parse result.content[0].text as JSON. If the parsed object contains an error key (e.g. {"error":"Site not found"} or {"error":"Unauthorized"}), the call FAILED — even though the JSON-RPC envelope said result. STOP immediately. Surface the error verbatim to the user. Do NOT invent a successful response with a made-up post id, approval URL, slug, or site name. Hallucinated success is worse than a visible failure — the user will publish content that doesn't exist or copy approval URLs to stakeholders that 404.
Only treat the call as successful when the parsed text contains the expected entity shape (e.g. {"id":..., "approval":{...}} for posts_create).
Output
Return to the user:
- Deck id + portal URL:
/portal/tools/pitch-decks/<id> - Slide count
- Approval URL from
decks_create.approval.url— this is what the user shares for review - A one-line summary of the deck spine
Iteration
- Tweak slides → call
decks_replace_slideswith the same deck id. This mutates the slide drafts in place. It does NOT mint a new approval URL. If a pending approval URL already exists on the deck, that URL keeps pointing at the same deck — the reviewer will see the updated draft slides next time they load it. - Metadata edit (title, description) → call
decks_update. Eachdecks_updatemints a fresh approval URL. Old URL stays in its current state; new one supersedes for review purposes. Return the new URL. - Major rework / a/b variant → call
decks_forkto clone the deck. The fork is a separate row with its own approval URL; approving the fork does NOT touch the parent. - Approving the deck → flips
status='published'AND auto-runsdecks_publish_all(promotes every slide draft to live). You do not need to calldecks_publish_allseparately when reviewing through an approval URL.
Failure modes
- No
.sd/config.json→ runsd-initfirst. - Subscription not active →
decks_createwill return "This feature requires an active pitch-decks subscription". Surface to user; can't proceed. - Block schema violation → slide insert will fail. Read the error, fix the offending block (most often a missing
idor unknowntype). - Pending approval gate → if the API key has
require_cms_approval, bothdecks_createanddecks_replace_slidesreturnpending: true. The approval URL still works; reviewers approve the staged change first to materialize the deck, then approve the slides.
Install
This skill ships as part of the SimplerDevelopment client skills bundle. Install the full skill bundle in one step from the portal:
https://simplerdevelopment.com/install
macOS, Windows, and Linux installers download the bundle to ~/.claude/skills/. Both Claude Desktop and Claude Code auto-discover skills from that path on next restart.
See CLIENT_QUICKSTART.md (installed alongside this file) for the full setup walkthrough, including the MCP-server config Claude Desktop needs and the one-time sd-init bootstrap.