Create slides & decks
SlideForge is a compiler: a slide is a typed intent (form + typed content fields) rendered
deterministically into native, editable .pptx — no LLM in the render path. $0.05/slide,
usable-or-free; identical input re-renders free.
The reliable path (use for real content)
- Pick the form.
browse_catalog lists 200+ patterns (kpi_metrics, waterfall_bridge,
gantt_plan, funnel, org_structure, data_table, comparison_matrix, timeline_roadmap, …).
Unsure? plan_slide with a one-line brief returns ranked candidates, free.
- Get the contract.
browse_catalog with type=schema + the form returns the JSON Schema
and a copy-pasteable example intent. Start from the example; swap in the user's real
content; keep the advertised field names exactly.
- Dry-run. Send the intent with
dry_run: true → status: validated + a
fidelity_forecast at $0. If errors[] come back, each carries a machine code and a
remedy — fix and re-dry-run. Never pay to discover a validation error.
- Render. Same payload without
dry_run. The response embeds a preview PNG inline, cost,
and the fidelity manifest. The editable file downloads separately (see below).
For a whole deck: ONE create_deck call with slides[] (a list of create_slide intents).
Parallel render, one merged pptx, per-slide fidelity rollup; failed slides are isolated and free.
Grammar worth knowing (v5.104 surface):
- Stat prominence: list/workflow block items take
metric: {value, label} — the number
renders as a stat column instead of hiding in prose. Keep values bare (42 or "42"),
no % signs, units, or currency symbols inside numeric fields.
- Architecture depth: layer stacks take
orientation: "horizontal" (left-to-right
pipeline with crossing control rails) and per-component state: current|target|gap
(capability-heat tinting) — consulting capability-map staples from one typed payload.
quality_profile (executive/technical/appendix) answers on ANY form — the response's
layout.presentation_ready is judged against it; measurement only, never blocks or bills.
Quick path (throwaway / exploratory)
A plain-text brief renders in one call — the engine routes it to a form. Fine for drafts;
expect fidelity: ai_completed (the model structured your prose). For business numbers,
always prefer typed fields.
Reading the response honestly
fidelity: verbatim — every word/number came from the user's input. Say so.
fidelity: mixed / ai_completed — the manifest names which fields a model completed.
Tell the user which parts to double-check.
fidelity: partial — some supplied content did not make it onto the slide. The manifest
names what was dropped. Never deliver a partial render without telling the user what's
missing.
status: completed_with_errors — the render is flawed and was NOT billed. Read the error
remedies, fix the intent, re-render. Do not deliver the artifact as if it were fine.
warnings[] — quality advisories (density, contrast, overflow) with remedies; the slide
billed and is usable, but mention material ones.
Headless verification (Claude Code / Codex CLI — no widgets)
The preview PNG is embedded inline in the tool result — read it directly, no fetch needed.
Always look at your own render before declaring done. Download the deliverable via header-auth:
curl -H "Authorization: Bearer sf_live_YOUR_KEY" \
-o slide.pptx https://api.slideforge.dev/v1/jobs/<job_id>/pptx # ownership-checked
If the preview shows a problem, fix the intent and re-render — refinement is a fresh $0.05
render (identical input is free, so only actual changes cost).
Escape hatch: mode=code
When no catalog form fits, create_slide with mode=code runs your python-pptx in a sandbox
(same $0.05, deterministic). browse_catalog type=widgets / type=helpers lists the bundled
board-grade widget + chart toolkit so you don't hand-roll primitives.
Do / don't
- DO put real content in
data.* typed fields; DON'T paste it into a brief when it matters.
- DO fix errors by their
remedy; DON'T retry an identical failed payload.
- DO use one
create_deck for multi-slide; DON'T loop create_slide.
- DO pass
min_font_pt when the user demands a minimum font size (binding: type grows to
meet it; unmeetable content = $0 error naming the size it needs); DON'T shrink-to-fit by
cutting the user's words yourself — allow_truncation drops whole items, never words.
- DO set
direction: "rtl" ONCE at deck level for Arabic/Hebrew content (it inherits into
every slide; a slide's own value wins) — never per slide only, which risks a mixed deck.
Text is typeset right-to-left; layout stays unmirrored and the response says so.
- DO pass
theme_id (or upload a brand kit template via upload_asset(purpose="brand", data=<base64>) — purpose="theme" is the same path under its old name, still accepted) for
branding — uploaded brand kits render NATIVE by default, built ON the client's own template
file (master, layouts, fonts). <slug>@<n> pins a specific kit version.
- DO use
create_slide(form="template_layout", theme_id=..., data={"layout": ..., "fills": ...})
to fill the template's own designed cover/agenda/divider slides verbatim.
- DO expect topical design on the default themes: an unpinned render may take a subject-informed
accent palette + designed cover (the response's design note names the choice). Pass
styling: "clean" for the neutral default look; a pinned theme_id/uploaded theme never
takes topical styling.
1---2name: create-slide3description: Create editable PowerPoint slides or whole decks with SlideForge. Use when the user asks to make a slide, deck, presentation, dashboard slide, chart slide, QBR/board exhibit, or anything that results in a .pptx file. Structured intents render deterministically with a fidelity manifest (verbatim vs ai_completed); briefs work too. Requires the slideforge MCP server (or the REST API).4license: MIT5---67# Create slides & decks89SlideForge is a compiler: a slide is a typed intent (`form` + typed content fields) rendered10deterministically into native, editable .pptx — no LLM in the render path. $0.05/slide,11usable-or-free; identical input re-renders free.1213## The reliable path (use for real content)14151. **Pick the form.** `browse_catalog` lists 200+ patterns (kpi_metrics, waterfall_bridge,16 gantt_plan, funnel, org_structure, data_table, comparison_matrix, timeline_roadmap, …).17 Unsure? `plan_slide` with a one-line brief returns ranked candidates, free.182. **Get the contract.** `browse_catalog` with `type=schema` + the form returns the JSON Schema19 **and a copy-pasteable example intent**. Start from the example; swap in the user's real20 content; keep the advertised field names exactly.213. **Dry-run.** Send the intent with `dry_run: true` → `status: validated` + a22 `fidelity_forecast` at $0. If `errors[]` come back, each carries a machine `code` and a23 `remedy` — fix and re-dry-run. Never pay to discover a validation error.244. **Render.** Same payload without `dry_run`. The response embeds a preview PNG inline, cost,25 and the **fidelity manifest**. The editable file downloads separately (see below).2627For a whole deck: ONE `create_deck` call with `slides[]` (a list of create_slide intents).28Parallel render, one merged pptx, per-slide fidelity rollup; failed slides are isolated and free.2930Grammar worth knowing (v5.104 surface):31- **Stat prominence**: list/workflow block items take `metric: {value, label}` — the number32 renders as a stat column instead of hiding in prose. Keep values bare (`42` or `"42"`),33 no % signs, units, or currency symbols inside numeric fields.34- **Architecture depth**: layer stacks take `orientation: "horizontal"` (left-to-right35 pipeline with crossing control rails) and per-component `state: current|target|gap`36 (capability-heat tinting) — consulting capability-map staples from one typed payload.37- **`quality_profile`** (executive/technical/appendix) answers on ANY form — the response's38 `layout.presentation_ready` is judged against it; measurement only, never blocks or bills.3940## Quick path (throwaway / exploratory)4142A plain-text `brief` renders in one call — the engine routes it to a form. Fine for drafts;43expect `fidelity: ai_completed` (the model structured your prose). For business numbers,44always prefer typed fields.4546## Reading the response honestly4748- `fidelity: verbatim` — every word/number came from the user's input. Say so.49- `fidelity: mixed / ai_completed` — the manifest names which fields a model completed.50 Tell the user which parts to double-check.51- `fidelity: partial` — some supplied content did not make it onto the slide. The manifest52 names what was dropped. Never deliver a `partial` render without telling the user what's53 missing.54- `status: completed_with_errors` — the render is flawed and was NOT billed. Read the error55 remedies, fix the intent, re-render. Do not deliver the artifact as if it were fine.56- `warnings[]` — quality advisories (density, contrast, overflow) with remedies; the slide57 billed and is usable, but mention material ones.5859## Headless verification (Claude Code / Codex CLI — no widgets)6061The preview PNG is embedded inline in the tool result — read it directly, no fetch needed.62Always look at your own render before declaring done. Download the deliverable via header-auth:6364```bash65curl -H "Authorization: Bearer sf_live_YOUR_KEY" \66 -o slide.pptx https://api.slideforge.dev/v1/jobs/<job_id>/pptx # ownership-checked67```6869If the preview shows a problem, fix the intent and re-render — refinement is a fresh $0.0570render (identical input is free, so only actual changes cost).7172## Escape hatch: mode=code7374When no catalog form fits, `create_slide` with `mode=code` runs your python-pptx in a sandbox75(same $0.05, deterministic). `browse_catalog type=widgets` / `type=helpers` lists the bundled76board-grade widget + chart toolkit so you don't hand-roll primitives.7778## Do / don't7980- DO put real content in `data.*` typed fields; DON'T paste it into a brief when it matters.81- DO fix errors by their `remedy`; DON'T retry an identical failed payload.82- DO use one `create_deck` for multi-slide; DON'T loop `create_slide`.83- DO pass `min_font_pt` when the user demands a minimum font size (binding: type grows to84 meet it; unmeetable content = $0 error naming the size it needs); DON'T shrink-to-fit by85 cutting the user's words yourself — `allow_truncation` drops whole items, never words.86- DO set `direction: "rtl"` ONCE at deck level for Arabic/Hebrew content (it inherits into87 every slide; a slide's own value wins) — never per slide only, which risks a mixed deck.88 Text is typeset right-to-left; layout stays unmirrored and the response says so.89- DO pass `theme_id` (or upload a brand kit template via `upload_asset(purpose="brand",90 data=<base64>)` — `purpose="theme"` is the same path under its old name, still accepted) for91 branding — uploaded brand kits render NATIVE by default, built ON the client's own template92 file (master, layouts, fonts). `<slug>@<n>` pins a specific kit version.93- DO use `create_slide(form="template_layout", theme_id=..., data={"layout": ..., "fills": ...})`94 to fill the template's own designed cover/agenda/divider slides verbatim.95- DO expect topical design on the default themes: an unpinned render may take a subject-informed96 accent palette + designed cover (the response's design note names the choice). Pass97 `styling: "clean"` for the neutral default look; a pinned `theme_id`/uploaded theme never98 takes topical styling.