skills/_disabled/make-slides/SKILL.md
Create branded HTML presentations using structured slide specs. Outputs JSON DeckSpec instead of raw HTML — the server handles all rendering, styling, and viewport fitting.
npx skillsauth add motleyai/agent-skills make-slidesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create branded HTML/PDF presentations by describing slide content declaratively. You specify what goes on each slide (layouts, text, data, charts); the server handles how it renders (HTML, CSS, animations, logos, waves, charts, tables).
Activate when the user asks to create slides, a deck, a presentation, or a report in any of these forms: "make me slides", "create a presentation", "build a deck", "slide deck", "PowerPoint", "PDF slides".
Ask the user these questions (skip any already answered):
list_resources(what="styles") to see available brand styles.read_layouts(style_name="chosen_style") to get the layout catalog.IMPORTANT: Layout names, panel counts, and constraints differ across styles. Each style has its own set of layouts — they are not interchangeable. You MUST call
read_layoutsfor the specific style you are building for — never reuse layout names from another style or from the example at the bottom of this file. Using a wrong layout name will causesave_deckto fail.
The catalog returns a list of layouts, each with:
Construct a JSON DeckSpec object. The schema:
{
"slides": [
{
"layout": "Layout Name",
"panels": [
{
"badge": "",
"title": "Heading text",
"subtitle": "Text below heading",
"aside": "Right-aligned note",
"body": { "kind": "...", ... }
}
]
}
]
}
body field)| kind | Fields | Use for |
|------|--------|---------|
| prose | text (markdown) | Paragraphs, bullet lists, inline formatting |
| data_points | columns (int, 0=auto), items (list of {value, label, detail?, highlighted?}) | Metrics, KPIs, funnel stages, summary rows |
| cards | columns (int, 0=auto), items (list of {title, body}) | Multi-column content, recommendation cards |
| tags | items (list of {text, highlighted?}) | Tag/pill clouds, company lists |
| chart | block_name (string) | Reference to a chart block in a Motley document |
| table | block_name (string) | Reference to a table block in a Motley document |
All header fields accept either a raw string or a block reference from the source Motley document. Block references are resolved server-side before rendering.
| Field | Purpose | Example |
|-------|---------|---------|
| badge | Small label above title (eyebrow, section tag) | "Section 01" or {"kind": "text_block_ref", "block_name": "section_label"} |
| title | Main heading (supports \n for line breaks) | "Q1 Results" or {"kind": "text_block_ref", "block_name": "report_title"} |
| subtitle | Text below title (supports markdown) | "**Jan–Mar 2025**" or {"kind": "query_block_ref", "block_name": "date_range"} |
| aside | Right-aligned secondary text | "Jan – Dec 2025" or {"kind": "query_block_ref", "block_name": "period"} |
Block reference types:
{"kind": "text_block_ref", "block_name": "..."} — resolves to the text block's markdown content, rendered as HTML.{"kind": "query_block_ref", "block_name": "..."} — resolves to the query block's formatted value (e.g. "$1.2M"). Only single-number mode queries are supported.The prose body type's text field also accepts these block references.
notes in each panel slot — don't overfill."$1.2M", "340%", "1,234"). This applies to header fields, prose text, and data_points value/detail fields. Instead, always use a query_block_ref or text_block_ref pointing to the block that produced that number. This ensures values stay in sync with the underlying data.save_deck(deck_spec=<your JSON>, style_name="chosen_style", title="Presentation Title", source_document_id=<if charts/tables>)
{"document_id": <new_id>}.export_document(document_id=<new_id>, format="html") to render the HTML.html_url to the user.export_document(document_id=<new_id>, format="pdf").{
"slides": [
{
"layout": "Title",
"panels": [{"title": "Q1 2025 SaaS Report", "subtitle": "Prepared for the Board"}]
},
{
"layout": "Content + Badge",
"panels": [{
"badge": "Overview",
"title": "Key Findings",
"body": {"kind": "prose", "text": {"kind": "text_block_ref", "block_name": "key_findings"}}
}]
},
{
"layout": "Three-Column Metrics",
"panels": [{
"title": "Key Metrics",
"body": {"kind": "data_points", "columns": 3, "items": [
{"value": {"kind": "query_block_ref", "block_name": "arr_total"}, "label": "ARR"},
{"value": {"kind": "query_block_ref", "block_name": "growth_rate"}, "label": "Growth"},
{"value": {"kind": "query_block_ref", "block_name": "retention_rate"}, "label": "Retention"}
]}
}]
},
{
"layout": "Closing / Thank You",
"panels": [{"title": "Thank You", "subtitle": "Questions? [email protected]"}]
}
]
}
data-ai
Create or modify text blocks using update_text_block. Covers template syntax with variable references, LLM generation, and constrained outputs.
data-ai
Create or modify table blocks using update_table_block. Covers template syntax, target_shape constraints, and table generation patterns.
data-ai
Create or modify numerical query blocks within text or table blocks using update_query_block. Queries provide data values referenced as {query_name} in parent templates.
data-ai
Create or modify charts using update_chart_block. Covers chart type selection, structured query and chart_details parameters, and verification with render_chart.