PowerPoint MCP Server Skill
Provides 16 PowerPoint MCP tools (one presentation tool + 15 domain action-dispatch tools)
via the Model Context Protocol, driving a live PowerPoint desktop instance through the official
Microsoft.Office.Interop.PowerPoint PIA. Tools are auto-discovered via MCP tools/list — this
skill documents session lifecycle, indexing conventions, workflows, and gotchas that aren't
obvious from tool schemas alone.
Session lifecycle, Save As/copy, templates, the advisory Mark as Final flag, document properties,
and presentation tags use the presentation action-dispatch tool with camelCase arguments.
Domain tools (slide, shape, textframe, table, chart, image, media,
notes, layout, master, smartart, animation, export, pagesetup, accessibility) are
action-dispatch: one tool per domain, called as tool(action: "kebab-action", session_id: ..., snake_case_param: ...).
Workflow Checklist
| Step |
Tool |
Action |
When |
| 1. Create or open |
presentation(action: "create"/"open") |
Start a session, get sessionId |
Always, before any edit |
| 3. Build |
slide(action: "add-blank"), shape(action: "add-rectangle"/"add-text-box"/"add-auto-shape"/"add-line"/"add-connector"), table(action: "add-table"), chart(action: "add-chart"), image(action: "add-picture"), media(action: "add-media") |
Add structure and content |
As needed |
| 4. Format |
textframe(action: "set-font-size"/"set-bold"/"set-font-color"), layout(action: "set-layout") |
Apply formatting |
After adding content |
| 5. Animate (optional) |
animation(action: "add-effect"/"set-transition") |
Add entrance/emphasis/exit effects or slide transitions |
After content/layout are final |
| 6. Annotate |
notes(action: "set-notes-text") |
Add speaker notes |
After each slide's content is final |
| 7. Verify |
export(action: "export-slide-to-image"/"export-all-slides-to-images") |
Visually confirm the result |
After any visual change |
| 8. Save & close |
presentation(action: "close", save: true) |
Persist and release the session |
Always last |
Preconditions
- Windows host with Microsoft PowerPoint installed (desktop, not web/mobile).
- Use full Windows paths:
C:\Users\Name\Documents\Deck.pptx.
- The target
.pptx/.pptm file must not be open in another PowerPoint window.
CRITICAL: Execution Rules (MUST FOLLOW)
Rule 1: Sessions Are Required for Every Edit
Every editing action requires the sessionId returned by presentation(action: "create"/"open").
See Behavioral Rules for the full session lifecycle.
Rule 2: Everything Is 1-Based
slideIndex, shapeIndex, and table row/column all start at 1, matching PowerPoint's own COM
object model — not 0-based like most languages. See
Behavioral Rules.
Rule 3: Save-on-Close Is Explicit
Nothing is written to disk unless presentation(action: "close", sessionId: ..., save: true) is
used. Closing with the default save: false discards all changes since the last save.
Rule 4: Close Does Not Block
presentation(action: "close", ...) returns immediately after removing the session; PowerPoint's own process
cleanup happens afterward in the background (can take up to a few minutes). Do not poll waiting
for the OS process to exit.
Rule 5: Verify Visually — This Is the Differentiator
export(action: "export-slide-to-image"/"export-all-slides-to-images", ...) renders real
PowerPoint output to an image. This is the only reliable way to catch overlapping shapes, text
overflow, or chart layout problems — text-only inspection tools (textframe(action: "get-text", ...), shape(action: "get-count", ...)) cannot. See
Export & Verify.
Rule 6: Never Ask Clarifying Questions
Discover state yourself instead of asking the user:
| Bad (Asking) |
Good (Discovering) |
| "Which presentation is open?" |
presentation(action: "list") |
| "How many slides are there?" |
slide(action: "get-count", session_id: sessionId) |
| "What shapes are already on this slide?" |
shape(action: "get-count", session_id: sessionId, slide_index: slideIndex) |
Rule 7: Always End With a Text Summary
Never end a turn with only a tool call. State what was built, the file path, and whether it was
saved.
Tool Selection Quick Reference
| Task |
Tool(s) |
| Create/open/test/close/list sessions |
presentation(action: "create"/"open"/"test"/"close"/"list") |
| Apply template, read theme name |
presentation(action: "apply-template"/"get-theme-name") |
| Read/set advisory Mark as Final state |
presentation(action: "get-final"/"set-final") |
| Document metadata (built-in and custom properties) |
presentation property actions |
| String metadata on presentations, slides, or shapes |
owner-specific set-tag/get-tag/list-tags/delete-tag actions |
| Add/count/delete/duplicate/reorder slides |
slide(action: "add-blank"/"get-count"/"delete"/"duplicate"/"move-to") |
| Per-slide background color, sections |
slide(action: "set-background-color"/"get-background-color"/"add-section"/"rename-section"/"delete-section"/"get-section-count"/"get-section-name") |
| Add/count/delete/move/resize shapes |
shape(action: "add-rectangle"/"add-text-box"/"add-auto-shape"/"add-line"/"add-connector"/"get-count"/"delete"/"set-position"/"set-size") |
| Format shapes and manage links |
shape(action: "set-fill"/"get-fill"/"set-line"/"get-line"/"set-rotation"/"get-rotation"/"flip"/"set-z-order"/"set-shadow"/"get-shadow"/"set-glow"/"get-glow"/"set-reflection"/"get-reflection"/"set-soft-edge"/"get-soft-edge"/"set-bevel"/"get-bevel"/"group"/"ungroup"/"set-name"/"get-name"/"set-alt-text"/"get-alt-text"/"set-hyperlink"/"get-hyperlink"/"remove-hyperlink"/"get-link-info"/"update-link"/"break-link"/"set-link-auto-update") |
| Set/read text and font formatting |
textframe(action: "set-text"/"get-text"/"set-font-size"/"set-bold"/"set-font-color"/"set-italic"/"set-underline"/"set-font-name"/"set-alignment"/"set-bullet") |
| Tables |
table(action: "add-table"/"set-cell-text"/"get-cell-text"/"insert-row"/"delete-row"/"insert-column"/"delete-column"/"set-cell-fill"/"get-cell-fill"/"set-cell-border"/"get-cell-border"/"merge-cells") |
| Native charts |
chart(action: "add-chart"/"get-chart-data"/"add-series"/"replace-chart-data"/"set-chart-title"/"get-chart-title"/"set-axis-title"/"get-axis-title"/"set-legend-visibility"/"get-legend-visibility"/"set-style"/"get-style"/"set-color-style"/"get-color-style"/"set-data-table"/"get-data-table") |
| SmartArt diagrams |
smartart(action: "add-smart-art"/"add-node"/"add-child-node"/"set-node-text"/"get-node-text"/"delete-node"/"get-node-count") |
| Images (embedded by default; optional file links) |
image(action: "add-picture"/"set-brightness-contrast"/"get-brightness-contrast"/"set-recolor"/"get-recolor"/"set-crop"/"get-crop") |
| Audio and video |
media(action: "add-media"/"get-media-info") |
| Speaker notes |
notes(action: "set-notes-text"/"get-notes-text") |
| Slide layouts |
layout(action: "set-layout"/"get-layout") |
| Slide master title/body font, background color |
master(action: "get-title-font"/"set-title-font"/"get-body-font"/"set-body-font"/"get-background-color"/"set-background-color") |
| Shape entrance/emphasis/exit effects, slide transitions |
animation(action: "add-effect"/"get-effect-count"/"delete-effect"/"get-transition"/"set-transition") |
| Visual verification |
export(action: "export-slide-to-image"/"export-all-slides-to-images") |
Reference Documentation
See references/ for detailed guidance:
- Behavioral rules — sessions, indexing, save/close semantics
- Canonical create → build → verify → save → close workflow
- Deck builder — assembling a multi-slide deck
- Slides and shapes — add/position/size/delete
- String tags — presentation, slide, and shape metadata
- Text formatting — set-text, font size/bold/color
- Tables — add-table, cell text, row/column edits, fill/border formatting, merge
- Charts — add-chart/add-series categories/series/values, titles, legend
- SmartArt — add-smart-art layouts, node addressing, hierarchy diagrams
- Images — picture insertion and picture-format adjustments
- Audio and video — embedded/linked insertion and media metadata
- Speaker notes — set/get notes
- Layouts — set/get slide layout
- Slide master — title/body font and background color
- Animations — entrance/emphasis/exit effects and slide transitions
- Export and verify — the visual verification loop
- Anti-patterns — common mistakes to avoid
1---2name: powerpoint-mcp3description: PowerPoint MCP Server skill for Windows presentation automation via a live PowerPoint desktop instance (COM/PIA). Use when an assistant needs rich MCP tools to create, open, build, format, and export PowerPoint (.pptx/.pptm) presentations — slides, shapes, text boxes, tables, native charts, images, audio, video, speaker notes, layouts, and image export for visual verification. Triggers: PowerPoint, presentation, deck, slides, pptx, pptm, speaker notes, chart, MCP.4---56# PowerPoint MCP Server Skill78Provides 16 PowerPoint MCP tools (one presentation tool + 15 domain action-dispatch tools)9via the Model Context Protocol, driving a live PowerPoint desktop instance through the official10`Microsoft.Office.Interop.PowerPoint` PIA. Tools are auto-discovered via MCP `tools/list` — this11skill documents session lifecycle, indexing conventions, workflows, and gotchas that aren't12obvious from tool schemas alone.1314Session lifecycle, Save As/copy, templates, the advisory Mark as Final flag, document properties,15and presentation tags use the `presentation` action-dispatch tool with camelCase arguments.16Domain tools (`slide`, `shape`, `textframe`, `table`, `chart`, `image`, `media`,17`notes`, `layout`, `master`, `smartart`, `animation`, `export`, `pagesetup`, `accessibility`) are18action-dispatch: one tool per domain, called as `tool(action:19"kebab-action", session_id: ..., snake_case_param: ...)`.2021## Workflow Checklist2223| Step | Tool | Action | When |24|------|------|--------|------|25| 1. Create or open | `presentation(action: "create"/"open")` | Start a session, get `sessionId` | Always, before any edit |26| 3. Build | `slide(action: "add-blank")`, `shape(action: "add-rectangle"/"add-text-box"/"add-auto-shape"/"add-line"/"add-connector")`, `table(action: "add-table")`, `chart(action: "add-chart")`, `image(action: "add-picture")`, `media(action: "add-media")` | Add structure and content | As needed |27| 4. Format | `textframe(action: "set-font-size"/"set-bold"/"set-font-color")`, `layout(action: "set-layout")` | Apply formatting | After adding content |28| 5. Animate (optional) | `animation(action: "add-effect"/"set-transition")` | Add entrance/emphasis/exit effects or slide transitions | After content/layout are final |29| 6. Annotate | `notes(action: "set-notes-text")` | Add speaker notes | After each slide's content is final |30| 7. Verify | `export(action: "export-slide-to-image"/"export-all-slides-to-images")` | Visually confirm the result | After any visual change |31| 8. Save & close | `presentation(action: "close", save: true)` | Persist and release the session | Always last |3233## Preconditions3435- Windows host with Microsoft PowerPoint installed (desktop, not web/mobile).36- Use full Windows paths: `C:\Users\Name\Documents\Deck.pptx`.37- The target `.pptx`/`.pptm` file must not be open in another PowerPoint window.3839## CRITICAL: Execution Rules (MUST FOLLOW)4041### Rule 1: Sessions Are Required for Every Edit4243Every editing action requires the `sessionId` returned by `presentation(action: "create"/"open")`.44See [Behavioral Rules](./references/behavioral-rules.md) for the full session lifecycle.4546### Rule 2: Everything Is 1-Based4748`slideIndex`, `shapeIndex`, and table `row`/`column` all start at 1, matching PowerPoint's own COM49object model — not 0-based like most languages. See50[Behavioral Rules](./references/behavioral-rules.md).5152### Rule 3: Save-on-Close Is Explicit5354Nothing is written to disk unless `presentation(action: "close", sessionId: ..., save: true)` is55used. Closing with the default `save: false` discards all changes since the last save.5657### Rule 4: Close Does Not Block5859`presentation(action: "close", ...)` returns immediately after removing the session; PowerPoint's own process60cleanup happens afterward in the background (can take up to a few minutes). Do not poll waiting61for the OS process to exit.6263### Rule 5: Verify Visually — This Is the Differentiator6465`export(action: "export-slide-to-image"/"export-all-slides-to-images", ...)` renders real66PowerPoint output to an image. This is the only reliable way to catch overlapping shapes, text67overflow, or chart layout problems — text-only inspection tools (`textframe(action: "get-text",68...)`, `shape(action: "get-count", ...)`) cannot. See69[Export & Verify](./references/export-and-verify.md).7071### Rule 6: Never Ask Clarifying Questions7273Discover state yourself instead of asking the user:7475| Bad (Asking) | Good (Discovering) |76|---------------|---------------------|77| "Which presentation is open?" | `presentation(action: "list")` |78| "How many slides are there?" | `slide(action: "get-count", session_id: sessionId)` |79| "What shapes are already on this slide?" | `shape(action: "get-count", session_id: sessionId, slide_index: slideIndex)` |8081### Rule 7: Always End With a Text Summary8283Never end a turn with only a tool call. State what was built, the file path, and whether it was84saved.8586## Tool Selection Quick Reference8788| Task | Tool(s) |89|------|---------|90| Create/open/test/close/list sessions | `presentation(action: "create"/"open"/"test"/"close"/"list")` |91| Apply template, read theme name | `presentation(action: "apply-template"/"get-theme-name")` |92| Read/set advisory Mark as Final state | `presentation(action: "get-final"/"set-final")` |93| Document metadata (built-in and custom properties) | `presentation` property actions |94| String metadata on presentations, slides, or shapes | owner-specific `set-tag`/`get-tag`/`list-tags`/`delete-tag` actions |95| Add/count/delete/duplicate/reorder slides | `slide(action: "add-blank"/"get-count"/"delete"/"duplicate"/"move-to")` |96| Per-slide background color, sections | `slide(action: "set-background-color"/"get-background-color"/"add-section"/"rename-section"/"delete-section"/"get-section-count"/"get-section-name")` |97| Add/count/delete/move/resize shapes | `shape(action: "add-rectangle"/"add-text-box"/"add-auto-shape"/"add-line"/"add-connector"/"get-count"/"delete"/"set-position"/"set-size")` |98| Format shapes and manage links | `shape(action: "set-fill"/"get-fill"/"set-line"/"get-line"/"set-rotation"/"get-rotation"/"flip"/"set-z-order"/"set-shadow"/"get-shadow"/"set-glow"/"get-glow"/"set-reflection"/"get-reflection"/"set-soft-edge"/"get-soft-edge"/"set-bevel"/"get-bevel"/"group"/"ungroup"/"set-name"/"get-name"/"set-alt-text"/"get-alt-text"/"set-hyperlink"/"get-hyperlink"/"remove-hyperlink"/"get-link-info"/"update-link"/"break-link"/"set-link-auto-update")` |99| Set/read text and font formatting | `textframe(action: "set-text"/"get-text"/"set-font-size"/"set-bold"/"set-font-color"/"set-italic"/"set-underline"/"set-font-name"/"set-alignment"/"set-bullet")` |100| Tables | `table(action: "add-table"/"set-cell-text"/"get-cell-text"/"insert-row"/"delete-row"/"insert-column"/"delete-column"/"set-cell-fill"/"get-cell-fill"/"set-cell-border"/"get-cell-border"/"merge-cells")` |101| Native charts | `chart(action: "add-chart"/"get-chart-data"/"add-series"/"replace-chart-data"/"set-chart-title"/"get-chart-title"/"set-axis-title"/"get-axis-title"/"set-legend-visibility"/"get-legend-visibility"/"set-style"/"get-style"/"set-color-style"/"get-color-style"/"set-data-table"/"get-data-table")` |102| SmartArt diagrams | `smartart(action: "add-smart-art"/"add-node"/"add-child-node"/"set-node-text"/"get-node-text"/"delete-node"/"get-node-count")` |103| Images (embedded by default; optional file links) | `image(action: "add-picture"/"set-brightness-contrast"/"get-brightness-contrast"/"set-recolor"/"get-recolor"/"set-crop"/"get-crop")` |104| Audio and video | `media(action: "add-media"/"get-media-info")` |105| Speaker notes | `notes(action: "set-notes-text"/"get-notes-text")` |106| Slide layouts | `layout(action: "set-layout"/"get-layout")` |107| Slide master title/body font, background color | `master(action: "get-title-font"/"set-title-font"/"get-body-font"/"set-body-font"/"get-background-color"/"set-background-color")` |108| Shape entrance/emphasis/exit effects, slide transitions | `animation(action: "add-effect"/"get-effect-count"/"delete-effect"/"get-transition"/"set-transition")` |109| Visual verification | `export(action: "export-slide-to-image"/"export-all-slides-to-images")` |110111## Reference Documentation112113See `references/` for detailed guidance:114115- [Behavioral rules — sessions, indexing, save/close semantics](./references/behavioral-rules.md)116- [Canonical create → build → verify → save → close workflow](./references/workflows.md)117- [Deck builder — assembling a multi-slide deck](./references/deck-builder.md)118- [Slides and shapes — add/position/size/delete](./references/slides-and-shapes.md)119- [String tags — presentation, slide, and shape metadata](./references/tags.md)120- [Text formatting — set-text, font size/bold/color](./references/text-formatting.md)121- [Tables — add-table, cell text, row/column edits, fill/border formatting, merge](./references/tables.md)122- [Charts — add-chart/add-series categories/series/values, titles, legend](./references/charts.md)123- [SmartArt — add-smart-art layouts, node addressing, hierarchy diagrams](./references/smart-art.md)124- [Images — picture insertion and picture-format adjustments](./references/images.md)125- [Audio and video — embedded/linked insertion and media metadata](./references/media.md)126- [Speaker notes — set/get notes](./references/speaker-notes.md)127- [Layouts — set/get slide layout](./references/layouts.md)128- [Slide master — title/body font and background color](./references/master.md)129- [Animations — entrance/emphasis/exit effects and slide transitions](./references/animations.md)130- [Export and verify — the visual verification loop](./references/export-and-verify.md)131- [Anti-patterns — common mistakes to avoid](./references/anti-patterns.md)