The model in one line
One spec → one render → two exports. The agent produces a deck spec (JSON). A theme-driven renderer turns it into a live HTML preview, and the same render is exported client-side to an editable PPTX (mapped from the rendered DOM geometry) and a pixel-perfect PDF. Look & feels are data (theme tokens served by an MCP server), so a new style is a new data entry: no code, no agent change.How it works
- The user asks for a deck / slides / pitch /
.pptx. The agent activates the deck-designer skill (progressive disclosure; see Capabilities). - The skill resolves a look & feel by calling the Slides MCP (
list_themes→ pick a style,get_theme(name)→ tokens). - The agent writes the deck spec (slides + resolved theme tokens) and emits it as a canvas artifact:
<pr-canvas>{"type":"slides"}--- <deck spec JSON></pr-canvas>. - The canvas renders the spec to a live HTML preview and offers PPTX (editable) and PDF exports; both run in the browser.
getBoundingClientRect + getComputedStyle) to PowerPoint shapes/text. The PDF rasterizes each rendered slide (landscape 16:9, one page per slide) and is always pixel-perfect. See Layouts: typed vs. freeform.The three pieces
Add Deck Designer to an agent
You bring deck building into any agent in three steps: open the agent and go to Capabilities (see Agent Capabilities):Add the skill
Add the Slides MCP server
slides-themes):get_theme / list_themes call to resolve a look & feel.Enable canvas
canvas_enabled for the agent. Without it, the agent never learns to emit the deck artifact, so the preview and export won’t appear.Themes (look & feel)
Themes ship as data in the Slides MCP, so re-skinning a deck is just picking another style; the content is untouched.list_themes) or “make the same deck in modern” (get_theme("modern")); the theme tokens are injected into the spec without rewriting the content.
Customizing the skill and the MCP server
Both pieces are meant to be tailored to your brand and use cases.Add or edit a theme (customize the MCP server)
A new brand or style is a new data entry, with no code and no agent change:- Open the
slides-mcpworkspace and editconfig.value.themes(inindex.yml). - Add an entry with your palette and fonts. Colors are bare hex (no leading
#; the renderer adds it, and now tolerates a leading#too). Use cross-platform fonts —Arial,Georgia,Times New Roman,Trebuchet MS,Verdana— so the browser preview and the exported PPTX render with matching metrics. Office/Mac-only faces (Calibri, Cambria, Helvetica) are automatically substituted to keep the export consistent.
list_themes exposes the new style automatically; the agent can offer it with no further change. You can also self-host your own copy of the MCP workspace and point your agent’s MCP capability at it.
Theme token reference
Every theme entry underconfig.value.themes is a token set. These are all the fields you can configure:
# is tolerated). The MCP exposes two tools: list_themes() → [{ name, label }], and get_theme(name) → the token set above (falls back to executive for an unknown name). Adding a theme = adding an entry here — no code, no agent change.
Customize the skill instructions
Thedeck-designer skill lives in the shared capability Store (the capabilities workspace catalog, exposed via the v1/servers API). A skill entry’s instructions live in its config_schema defaults, so you can:
- Fork it for your team: publish your own
type: skillentry (e.g. tighter brand rules, your preferred layouts, a fixed default theme) and add that instead. - Use the Custom Skill template: the catalog ships a generic Custom Skill entry; create a brand-new skill from scratch with your own instructions, activated on demand via progressive disclosure.
Layouts: typed vs. freeform
Deck Designer works from a set of typed layouts — hand-tuned, brand-aware building blocks:title, section, agenda, bullets, twocolumn, stats, kpi, split, process, timeline, comparison, table, quote, closing. When a point fits one of these, the agent fills its fields and the slide exports through a native PowerPoint emitter: fixed 16:9 geometry with automatic text-fitting, so the result is deterministic and identical across PowerPoint (Windows and Mac), LibreOffice and Keynote.
When no typed layout fits, the agent authors a freeform slide as inline HTML. Freeform gives full design freedom, but it exports through a best-effort DOM-to-PowerPoint mapping (reading the rendered geometry) rather than a native emitter.
Tips for clean freeform export
- Prefer typed layouts; reach for freeform only when nothing fits.
- Keep freeform slides simple: one piece of text per element, generous spacing, no overflow.
- Use the theme’s cross-platform fonts (see Themes) so the preview and the PPTX use matching metrics.
Typed layout reference
Every slide is one object inspec.slides. This is the contract the deck-designer skill emits (and what you’d edit if you fork it). All fields are strings unless noted; eyebrow is the small uppercase kicker; empty/extra items beyond a layout’s cap are dropped on export.
title — opener (dark)
title — opener (dark)
section — section divider (dark)
section — section divider (dark)
agenda — numbered contents (≤ 7 items)
agenda — numbered contents (≤ 7 items)
bullets — key points (≤ 6, use sparingly)
bullets — key points (≤ 6, use sparingly)
twocolumn — takeaway + proof panel
twocolumn — takeaway + proof panel
stats — three big numbers (exactly 3)
stats — three big numbers (exactly 3)
kpi — metric grid (3–6)
kpi — metric grid (3–6)
split — capabilities + data panel
split — capabilities + data panel
process — numbered steps (3–5)
process — numbered steps (3–5)
timeline — roadmap (3–6 milestones, one highlight)
timeline — roadmap (3–6 milestones, one highlight)
comparison — 2–3 columns, same rows (one highlight)
comparison — 2–3 columns, same rows (one highlight)
table — grid (≤ 6 columns, ≤ 7 rows)
table — grid (≤ 6 columns, ≤ 7 rows)
quote — testimonial (dark, ≤ 25 words)
quote — testimonial (dark, ≤ 25 words)
closing — the ask / CTA (dark)
closing — the ask / CTA (dark)
freeform — anything else (best-effort export)
freeform — anything else (best-effort export)
var(--dark|light|ink|muted|accent|soft|line|font-head|font-body)); inline styles only, no external assets, one text per element, no overflow.