Claude pptx skill: 10 PowerPoint decks you can ship
Ten real .pptx decks — board update, sales pitch, customer QBR, product roadmap, all-hands, conference fallback, investor pitch, RFP response, training, and brand-compliant launch — each as a single Claude prompt with the exact python-pptx script it produces.
If you found this looking for the developer-slides equivalent, the companion piece is 10 decks you can ship today with the Claude Slidev skill. Slidev is markdown-as-slides for developer talks. The pptx skill here is editable PowerPoint your colleagues can open and edit. Pick Slidev when you control the venue; pick pptx when the venue tells you it has to be PowerPoint.
Already know what skills are? Skip to the cookbook. First time? Read the explainer then come back. Need the install? It’s on the /skills/pptx page.

On this page · 21 sections▾
- What this skill does
- The cookbook
- Install + README
- Watch it built
- 01 · Quarterly board update deck
- 02 · Customer QBR (Quarterly Business Review)
- 03 · RFP response deck
- 04 · Investor pitch deck
- 05 · Sales training deck
- 06 · All-hands company update
- 07 · Product launch deck
- 08 · Customer-facing onboarding tutorial
- 09 · Conference talk template
- 10 · Recurring weekly status (auto-generated from a CSV)
- Community signal
- The contrarian take
- Real decks shipped
- Gotchas
- Pairs well with
- FAQ
- Sources
What this skill actually does
Sixty seconds of context before the cookbook — what the pptx skill is, what Claude returns when you invoke it, and the one thing it does NOT do for you.
What this skill actually does
“Presentation creation, editing, and analysis. When Claude needs to work with presentations (.pptx files).”
— anthropics, the skill author · /skills/pptx
What Claude returns
When triggered, Claude returns a self-contained Python script (`deck.py`) and the `.pptx` it generates. The script imports `Presentation` from `pptx`, picks `slide_layouts[N]` (0=Title, 1=Title+Content, 5=Title Only, 6=Blank), fills placeholders or `add_textbox`, draws tables with `add_table(rows, cols)`, embeds charts with `CategoryChartData` + `XL_CHART_TYPE.COLUMN_CLUSTERED`, places images via `add_picture`, and writes the file with `prs.save()`. Run `python deck.py` and a real editable .pptx lands on disk.
What it does NOT do
It does not install python-pptx for you — `pip install python-pptx` first, then trigger the skill. It also does not open or render the deck visually; you still open it in PowerPoint or LibreOffice to review.
How you trigger it
Build me a board update deck from this CSV.Create a 12-slide investor pitch as a .pptx I can edit.Open templates/brand.pptx and add a QBR section with a chart.Cost when idle
~100 tokens at idle (the skill name + description in the system prompt). Body, scripts/, and editing.md load only when triggered.
The cookbook
Each entry below is a deck you could ship this week. They run roughly in order of corporate gravity — the early ones reuse a master template, the middle ones lean on python-pptx primitives (tables, charts, MSO_SHAPE), and the later ones compose the skill with brand rules and other MCP servers. Every entry pairs with one or two skills or MCP servers you already have on mcp.directory.
Install + README
If the skill isn’t on your machine yet, here’s the one-liner. The full install panel (Codex, Copilot, Antigravity variants) is on the skill page — the same UI’s embedded below.
One-line install · by anthropics
Open skill pageInstall
mkdir -p .claude/skills/pptx && curl -L -o skill.zip "https://mcp.directory/api/skills/download/7" && unzip -o skill.zip -d .claude/skills/pptx && rm skill.zipInstalls to .claude/skills/pptx
Watch it built
Anthropic’s own walkthrough of how Agent Skills work. The pptx skill is one of the four built-ins (pdf, docx, xlsx, pptx) the video demos by name — useful before the cookbook because it anchors the contract before you read the prompts.
Quarterly board update deck
Twelve slides for the board meeting: cover, agenda, financial summary, KPI charts, headcount, runway, asks. Reuses the company template so the master fonts and logo carry through.
ForFounders and CFOs prepping for a board meeting.
The prompt
Open `templates/board.pptx` and add a Q1 2026 board update section after the cover slide. Sections in order: agenda (5 bullets), financial summary (revenue, gross margin, burn — pull from `data/financials_q1.csv`), KPI dashboard (ARR, NPS, retention as a 3-bar chart), headcount (team breakdown table), 18-month runway, three asks. Use `slide_layouts[1]` for content slides and `slide_layouts[5]` for the chart slide. Save as `out/board-q1-2026.pptx`.What slides.md looks like
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
prs = Presentation('templates/board.pptx')
agenda = prs.slides.add_slide(prs.slide_layouts[1])
agenda.shapes.title.text = 'Agenda — Q1 2026'
body = agenda.placeholders[1].text_frame
for line in ['Financials', 'KPIs', 'Headcount', 'Runway', 'Asks']:
body.add_paragraph().text = line
chart_slide = prs.slides.add_slide(prs.slide_layouts[5])
data = CategoryChartData()
data.categories = ['ARR', 'NPS', 'Retention']
data.add_series('Q1', (4_200_000, 62, 0.94))
chart_slide.shapes.add_chart(
XL_CHART_TYPE.BAR_CLUSTERED, Inches(1), Inches(2), Inches(8), Inches(4.5), data
)
prs.save('out/board-q1-2026.pptx')One-line tweak
Swap `templates/board.pptx` for an investor template and add a 'next round' slide between runway and asks to repurpose the same script for a fundraising update.
Customer QBR (Quarterly Business Review)
Eighteen-slide QBR for a key customer: account summary, ARR delta, NPS, pipeline, support tickets, roadmap previews, and the renewal ask. Each metric is a real `add_table` row, not a screenshot.
ForCustomer success managers running QBRs against named accounts.
The prompt
Generate a QBR deck for the customer in `data/account.json` (fields: name, ARR, NPS, tickets, csat, expansion_arr). Open `templates/customer-qbr.pptx`, fill the cover with the account name, build a metrics summary slide as a 2-column `add_table` (label / value), then a pipeline table with 5 named opportunities. End with three roadmap items and a one-line renewal ask. Save as `out/qbr-{account_slug}.pptx`.What slides.md looks like
import json
from pptx import Presentation
from pptx.util import Inches
acct = json.load(open('data/account.json'))
prs = Presentation('templates/customer-qbr.pptx')
slide = prs.slides.add_slide(prs.slide_layouts[5])
slide.shapes.title.text = f"{acct['name']} — QBR Q1 2026"
tbl = slide.shapes.add_table(5, 2, Inches(1), Inches(2), Inches(8), Inches(3)).table
rows = [('ARR', f"${acct['arr']:,}"), ('NPS', acct['nps']),
('CSAT', f"{acct['csat']}%"), ('Open tickets', acct['tickets']),
('Expansion ARR', f"${acct['expansion_arr']:,}")]
for i, (k, v) in enumerate(rows):
tbl.cell(i, 0).text = k
tbl.cell(i, 1).text = str(v)
prs.save(f"out/qbr-{acct['name'].lower().replace(' ', '-')}.pptx")One-line tweak
Replace the 5-row table with a `CategoryChartData` line chart across four quarters to show trend instead of point-in-time.
RFP response deck
Twenty-slide RFP response: cover, executive summary, our differentiation, security posture, implementation timeline, pricing comparison table, and the SOW summary. Built section-by-section against the buyer's requirements doc.
ForSales engineers and proposal writers responding to enterprise RFPs.
The prompt
Read `rfp/buyer-requirements.md` and produce a 20-slide RFP response. For each requirement, generate a one-line response in the format 'Requirement → Our answer'. Build a security posture slide listing SOC 2, ISO 27001, GDPR with a green checkmark shape per item. Add a 4-column pricing comparison table (Tier / Users / Price / Support SLA) and a Gantt-style timeline using rectangles in `slide_layouts[6]`. Save as `out/rfp-response.pptx`.What slides.md looks like
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
prs = Presentation()
sec = prs.slides.add_slide(prs.slide_layouts[5])
sec.shapes.title.text = 'Security & Compliance'
tbl = sec.shapes.add_table(4, 2, Inches(1), Inches(2), Inches(8), Inches(3)).table
for i, (cert, status) in enumerate([('SOC 2 Type II', 'Active'),
('ISO 27001', 'Active'),
('GDPR', 'Compliant'),
('HIPAA', 'BAA available')]):
tbl.cell(i, 0).text = cert
cell = tbl.cell(i, 1)
cell.text = status
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(0x10, 0xB9, 0x81)
prs.save('out/rfp-response.pptx')One-line tweak
Swap the 4-row certification table for a 12-row 'requirement → response' grid pulled from the requirements doc — same script, different table contents.
Investor pitch deck
Twelve-slide seed pitch in the Sequoia format: problem, solution, why now, market size, business model, traction, GTM, team, ask. Each slide is a single big idea — no bullet vomit.
ForFounders raising a seed or Series A.
The prompt
Build a 12-slide investor deck in 16:9 (use `Presentation()`, set width=Inches(13.333), height=Inches(7.5)). Layouts: cover → problem → solution → why now → market (TAM/SAM/SOM as a 3-row table) → product (3 screenshots from `assets/`) → traction (revenue chart) → business model → GTM → team → competition → the ask. One sentence per slide for the headline, one image or chart for proof.What slides.md looks like
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
traction = prs.slides.add_slide(prs.slide_layouts[5])
traction.shapes.title.text = 'Traction'
data = CategoryChartData()
data.categories = ['Q1', 'Q2', 'Q3', 'Q4']
data.add_series('ARR ($k)', (120, 280, 540, 920))
traction.shapes.add_chart(
XL_CHART_TYPE.LINE, Inches(1), Inches(1.8), Inches(11.3), Inches(5),
data,
)
prs.save('out/seed-pitch.pptx')One-line tweak
Swap LINE for AREA and the chart instantly reads as 'cumulative revenue' — same numbers, different story for a Series A audience.
Sales training deck
Forty-slide internal training: product overview, ICP, discovery questions, common objections + responses, demo script, and a quiz at the end. Heavy on bullets and tables — the script reuses one master layout for the entire decks's bulk.
ForSales enablement teams onboarding new AEs.
The prompt
Build a 40-slide sales training deck. Module 1 (5 slides): product overview, value props, ICP. Module 2 (10 slides): discovery questions grouped by buyer persona — render as a 3-column table per persona. Module 3 (15 slides): top 15 objections, each as 'Objection / Response / Proof'. Module 4 (5 slides): demo script. Module 5 (5 slides): quiz with answers in speaker notes. Use `slide_layouts[1]` consistently and add speaker notes via `slide.notes_slide.notes_text_frame`.What slides.md looks like
from pptx import Presentation
prs = Presentation()
objections = [('Too expensive', 'ROI calculator', 'Acme saved $80k/yr'),
('We use Competitor X', '3 native integrations', 'Switched 14 logos')]
for o, r, p in objections:
s = prs.slides.add_slide(prs.slide_layouts[1])
s.shapes.title.text = f'Objection: {o}'
body = s.placeholders[1].text_frame
body.text = f'Response: {r}'
body.add_paragraph().text = f'Proof: {p}'
s.notes_slide.notes_text_frame.text = (
f'Pause after stating the objection. Validate the buyer first.'
)
prs.save('out/sales-training.pptx')One-line tweak
Move the objections list to a CSV and loop over `csv.DictReader` so the rep-enablement team can edit objections without touching Python.
All-hands company update
Fifteen-slide monthly all-hands: north star metric, wins, customer logos, hires, what's next, and a Q&A holding slide. Branded cover, lots of logos as `add_picture` calls.
ForCOO / chief of staff running monthly all-hands.
The prompt
Open `templates/allhands.pptx` and assemble a March all-hands. Slide 1 cover with month + theme. Slide 2 north star metric as a single big number (Pt(120) typography). Slide 3 wins as 5 bullets. Slide 4 a logo wall — read `assets/logos/*.png` and grid them 5 across, 2 down using `add_picture` with calculated `Inches()` offsets. Slide 5 new hires (table: name / role / start date). Save as `out/allhands-march.pptx`.What slides.md looks like
import os
from pptx import Presentation
from pptx.util import Inches, Pt
prs = Presentation('templates/allhands.pptx')
wall = prs.slides.add_slide(prs.slide_layouts[6])
wall.shapes.title.text = 'New customer logos'
logos = sorted(os.listdir('assets/logos'))[:10]
for i, name in enumerate(logos):
col, row = i % 5, i // 5
wall.shapes.add_picture(
f'assets/logos/{name}',
Inches(0.6 + col * 1.85), Inches(2 + row * 1.6),
height=Inches(1.2),
)
prs.save('out/allhands-march.pptx')One-line tweak
Replace the logo wall with a customer-quote wall — `add_textbox` over a colored rectangle in each grid cell. Same loop, different content.
Product launch deck
Ten-slide launch announcement deck for the sales team: what shipped, what changed, three before/after screenshots, pricing impact, and the GTM motion. Real screenshots embedded via `add_picture`, no Lorem Ipsum.
ForProduct marketers shipping a feature launch to GTM.
The prompt
Build a 10-slide launch deck for feature 'Real-time alerts'. Slide 3 is a before/after — two screenshots from `assets/before.png` and `assets/after.png` placed side by side, each at Inches(5) wide. Slide 4 is pricing impact: a 3-row table comparing the old SKU to the new SKU. Slide 6 is a GTM motion timeline using rectangles for week-1, week-2, week-3 milestones. Save as `out/launch-realtime-alerts.pptx`.What slides.md looks like
from pptx import Presentation
from pptx.util import Inches
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor
prs = Presentation()
ba = prs.slides.add_slide(prs.slide_layouts[5])
ba.shapes.title.text = 'Before / After'
ba.shapes.add_picture('assets/before.png', Inches(0.4), Inches(2), width=Inches(4.6))
ba.shapes.add_picture('assets/after.png', Inches(5.2), Inches(2), width=Inches(4.6))
gtm = prs.slides.add_slide(prs.slide_layouts[5])
for i, label in enumerate(['Week 1: Beta', 'Week 2: GA', 'Week 3: Email blast']):
box = gtm.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
Inches(0.5 + i * 3.2), Inches(3), Inches(3), Inches(1))
box.fill.solid(); box.fill.fore_color.rgb = RGBColor(0x14, 0xB8, 0xA6)
box.text_frame.text = label
prs.save('out/launch-realtime-alerts.pptx')One-line tweak
Add a fourth `Inches(0.5 + 3 * 3.2)` rectangle for 'Week 4: Case study' to extend the GTM timeline by one milestone.
Customer-facing onboarding tutorial
Twelve-slide onboarding deck a CSM emails to new customers: account setup, first integration, first dashboard, common pitfalls, support contacts. Heavy on annotated screenshots — `add_picture` plus a callout shape with an arrow on top.
ForCSMs and onboarding specialists at SaaS companies.
The prompt
Build a 12-slide onboarding deck. For each of the 5 setup steps, render the relevant screenshot from `assets/onboarding/step{N}.png` at Inches(8) wide and place a yellow callout shape (`MSO_SHAPE.OVAL` outline, no fill) at the right coordinates over the button the user must click. Add the support contacts as a 2-column table on the last slide. Save as `out/onboarding.pptx`.What slides.md looks like
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor
prs = Presentation()
for n, (img, x, y) in enumerate([('step1.png', 6.4, 3.2), ('step2.png', 5.1, 4.0)]):
s = prs.slides.add_slide(prs.slide_layouts[5])
s.shapes.title.text = f'Step {n+1}'
s.shapes.add_picture(f'assets/onboarding/{img}', Inches(0.8), Inches(1.8), width=Inches(8))
callout = s.shapes.add_shape(MSO_SHAPE.OVAL, Inches(x), Inches(y), Inches(0.9), Inches(0.5))
callout.fill.background()
callout.line.color.rgb = RGBColor(0xFA, 0xCC, 0x15); callout.line.width = Pt(3)
prs.save('out/onboarding.pptx')One-line tweak
Pass the (img, x, y) tuples in from a YAML file so a CSM can update the callout positions without editing Python.
Conference talk template
Twenty-slide talk template that doubles as a fallback when the venue's IT requires .pptx (no browser, no Slidev). Cover, three-act structure, code blocks rendered as monospace `add_textbox`, Q&A holder.
ForEngineers giving conference talks where the AV booth only opens .pptx.
The prompt
Open `templates/talk.pptx` (a black 16:9 master). Add 20 slides following the three-act structure: Act 1 setup (5 slides), Act 2 escalation (10 slides), Act 3 payoff (5 slides). For any code-block slide, use `add_textbox` with `Pt(20)` Consolas font. Embed the conference logo on every slide via the slide master. Save as `out/talk-2026.pptx`.What slides.md looks like
from pptx import Presentation
from pptx.util import Inches, Pt
prs = Presentation('templates/talk.pptx')
slide = prs.slides.add_slide(prs.slide_layouts[6])
box = slide.shapes.add_textbox(Inches(0.5), Inches(0.5), Inches(12.3), Inches(6.5))
tf = box.text_frame; tf.word_wrap = True
code = '''def detect(events):
for e in events:
if e.score > 0.9:
yield e'''
for line in code.split('\n'):
p = tf.add_paragraph()
p.text = line
p.font.name = 'Consolas'
p.font.size = Pt(20)
prs.save('out/talk-2026.pptx')One-line tweak
Wrap the code block in a soft-edged rectangle (`MSO_SHAPE.ROUNDED_RECTANGLE` behind the textbox) for a code-card aesthetic without leaving python-pptx.
Recurring weekly status (auto-generated from a CSV)
Eight-slide weekly status deck the script regenerates every Monday from `data/status.csv`. No human edits — cron runs `python deck.py` and the deck lands in Drive. The deck is the report.
ForEngineering managers who hate writing the same weekly status by hand.
The prompt
Read `data/status.csv` (columns: project, status, owner, eta, blockers). Build an 8-slide deck: cover with the week-of date, then a per-project slide for each row showing project name as title, status as a colored badge (`MSO_SHAPE.RECTANGLE` with green/yellow/red fill), owner + ETA in the body, and any blocker as a callout box. Save with the date in the filename: `out/status-2026-04-29.pptx`.What slides.md looks like
import csv, datetime as dt
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor
COLORS = {'green': 0x10B981, 'yellow': 0xF59E0B, 'red': 0xEF4444}
prs = Presentation()
for row in csv.DictReader(open('data/status.csv')):
s = prs.slides.add_slide(prs.slide_layouts[5])
s.shapes.title.text = row['project']
rgb = COLORS.get(row['status'], 0x6B7280)
badge = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(8), Inches(0.5), Inches(1.6), Inches(0.5))
badge.fill.solid(); badge.fill.fore_color.rgb = RGBColor((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF)
badge.text_frame.text = row['status'].upper()
prs.save(f"out/status-{dt.date.today().isoformat()}.pptx")One-line tweak
Add a final summary slide that aggregates blockers across all projects — one bullet per blocker — by collecting `row['blockers']` into a list during the loop.
Community signal
Three voices from people using the pptx skill (or python-pptx underneath) for real work. The first is the strongest endorsement — Simon Willison’s reverse-engineering — the second is the daily-use story, the third is the comparative quality assessment.
“I just learned Claude's new code interpreter mode has a /mnt/skills/public/ folder full of prompt instructions and Python utilities for creating and manipulating pdf, docx, pptx, and xlsx files - and you can ask Claude for a copy and learn a TON about working with those formats”
Simon Willison · X / Twitter
Simon reverse-engineering the bundled skill files inside Claude — pptx is one of the four built-ins he calls out by name.
“Fortunately for us, there is an excellent python library for creating and updating PowerPoint files: python-pptx. The API is very well documented so it is pretty easy to use.”
Chris Moffitt (Practical Business Python) · Blog
The original (2015) reference tutorial — still the most-cited python-pptx walkthrough on the open web.
“I am using the open-source library python-pptx to build our PowerPoint decks.”
Samir Saci (Towards Data Science) · Blog
Supply-chain analyst writing an automated weekly KPI deck from a Pandas pipeline — the canonical 'data scientist ships a slide every Monday' use case.
The contrarian take
Not everyone is bullish on python-pptx as a long-term bet. The most honest critique on the project’s issue tracker is from ariwk (SBB pandoc-service maintainer):
“The python-pptx dependency (currently used for PPTX post-processing) has not been actively maintained since August 2024.”
ariwk (SBB pandoc-service maintainer) · Blog
From python-pptx issue #1122 (open) — the project is in maintenance mode.
Fair concern. python-pptx is in maintenance mode — not active feature development. The skill leans on the parts that have been stable for years (Presentation, slide_layouts, add_textbox, add_table, add_chart, RGBColor) and avoids the long-tail XML internals where issues pile up. If you need SVG insertion, modern chart types, or features outside the stable core, the skill will surface the gap and tell you to fall back to manual XML or the bundled pptxgenjs.md cheat-sheet.
One more comparison worth naming: there are several PowerPoint MCP servers — office-powerpoint, pandoc-markdown-to-powerpoint, and the broader markitdown server — that wrap pptx authoring as MCP tools. The trade-off is the usual skill-vs-MCP one: the skill is ~120 idle tokens, the MCP’s tool schemas load every turn. Pick the MCP only when multiple AI clients need to render decks against a shared instance — otherwise stick with the skill in this cookbook.
Real decks shipped with python-pptx
Concrete examples from public projects. Most of these don’t use the Claude skill specifically — they’re here to show what production-grade python-pptx pipelines look like, so you have a target shape in mind when you write the prompt.
- Samir Saci — automating supply-chain KPI decks every Monday with python-pptx + Pandas
- Keith McNulty — parameterized PowerPoint generation pipeline (R + Python, used in HR analytics)
- Chris Moffitt — Practical Business Python's reference tutorial: dynamic deck from a Pandas DataFrame
- Dilip Sripuram (AutoPPT) — batch report generator combining Pandas + xlrd + python-pptx
- mkongstad — Reddit-thread-to-PowerPoint generator using python-pptx
- Anthony Schrapffer — '140-slide PowerPoint deck with charts and summaries in seconds' reporting workflow
Gotchas (the four that bite)
Sourced from the python-pptx issue tracker and the bundled Anthropic skill repo.
SVG images don't insert
add_picture() rejects SVG (issue #1112). Convert to PNG first via Pillow or rsvg-convert. The skill knows this — if you @attach an .svg, it will run a conversion step before add_picture.
Layout indices are template-specific
slide_layouts[5] is 'Title Only' on the default theme but may be 'Comparison' or anything else on a corporate template. When opening a custom template, list `[l.name for l in prs.slide_layouts]` first and pick by name, not index.
Text auto-fit isn't automatic
python-pptx doesn't shrink text to fit a textbox. Long bullets overflow silently. Cap each bullet at ~80 chars and titles at ~60 chars; the cookbook prompts already enforce this. Set `text_frame.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE` if you want runtime fitting.
Charts look generic without theming
add_chart() emits a default Office theme. To match brand colors you must walk into the chart's series and set `series.format.fill.solid()` + `fore_color.rgb`. The skill does this when you pass a brand JSON; without one, expect the default blue.
Pairs well with
Curated to match the cookbook’s actual integrations: the presentation-adjacent skills (slidev, frontend-slides, brand-voice, confluence) plus the MCP servers the longer use cases (3, 5, 8, 10) lean on.
Related skills
Related MCP servers
Two posts that compose well with this cookbook: What are Claude Code skills? covers the underlying mechanism, and 10 decks you can ship today with the Claude Slidev skill covers the developer-slides side — the same cookbook shape, a different format, and the natural pair when the venue lets you choose the toolchain.
Frequently asked questions
Do I need to know python-pptx before I can use the pptx skill?
No. The skill writes the python-pptx code for you, including imports, layout indices, and shape coordinates. You only need Python installed and `pip install python-pptx`. Reading what Claude wrote afterwards is a useful sanity check — every cookbook entry above shows the exact API surface it picks.
Is there a python-pptx MCP server I should use instead of the pptx skill?
There are several — `office-powerpoint`, `pandoc-markdown-to-powerpoint`, and the broader `markitdown` server all expose pptx-related tools over MCP. They are useful when multiple AI clients need to render decks against a shared running service. For a single developer authoring decks from one Claude session, the pptx skill is the lighter option: ~120 tokens at idle versus an MCP whose tool schemas load every turn.
Can the pptx skill edit an existing .pptx, or only create new ones?
Both. The skill ships an editing playbook (editing.md) and helper scripts that unpack the .pptx XML, perform structural changes — slide reorder, slide delete, master tweaks — and repack with validation. Use cases 1, 9, and 10 above all open an existing template instead of creating from scratch.
How do I export a Slidev deck to a real editable .pptx instead of an image-flattened one?
Use case 6 above is exactly that. Slidev's own pptx exporter rasterizes each slide to PNG. The pptx skill takes the source markdown and generates a python-pptx script that produces real text frames — every word selectable in PowerPoint. That's the right path when the venue's IT requires editable .pptx.
Will the pptx skill respect my brand colors and corporate template?
Yes when you pass it the inputs. Open your template with `Presentation('templates/yours.pptx')` instead of `Presentation()`, and pass a brand JSON (use case 2). The skill applies `RGBColor.from_string()` for every fill, never invents a hex code, and leaves the slide_master alone unless you explicitly ask it to edit master slides.
Why is 'pptx' getting impressions on Google but no clicks?
The bare 'pptx' query brings up the python-pptx readthedocs and Microsoft's PowerPoint format spec as the top results. This blog targets the long-tail variants where developers want a how-to: 'pptx skill', 'codex pptx skill', 'agent skill pptx', and 'python-pptx mcp'. Those are the queries the cookbook above is built to rank for.
Does the pptx skill support charts, tables, and embedded images?
All three. Use case 3 builds a metrics table with `add_table` and per-cell color fills. Use case 5 emits a `CategoryChartData` column-clustered chart that stays editable in PowerPoint. Use case 9 embeds screenshots via `add_picture` with callout shapes positioned in `Inches()` over the image.
What's the difference between using the pptx skill versus pasting python-pptx examples into a CLAUDE.md?
A skill loads only when triggered (~120 tokens at idle), so it's nearly free. A CLAUDE.md loads on every turn — you'd be paying the python-pptx syntax tax even when writing unrelated code. Use the skill if you ship decks occasionally; CLAUDE.md only if every project session generates a slide.
Sources
Primary
- Anthropic skills/pptx — SKILL.md, editing.md, pptxgenjs.md, scripts/
- python-pptx official documentation
- python-pptx quickstart (Presentation, slide_layouts, add_textbox)
- python-pptx charts (CategoryChartData, XL_CHART_TYPE)
- python-pptx autoshapes (MSO_SHAPE constants)
Community
- Simon Willison — X / Twitter
- Chris Moffitt (Practical Business Python) — Blog
- Samir Saci (Towards Data Science) — Blog
- Keith McNulty — Blog
- Joel Tovar — Blog
- Dilip Sripuram (AutoPPT) — Blog
Critical and contrarian
Internal