Skip to main content
Glama

power-point-mcp

An MCP (Model Context Protocol) server that lets Claude read, create, and edit a single, pre-bound PowerPoint file. Bind the server to one .pptx and one optional template via environment variables; the server refuses to touch anything else on disk. Claude can then ask for slide metadata, list slides, read a slide's shapes, create the file from your template, and add new slides whose text comes only from the user.

Prerequisites

  • Python 3.14 (matches .python-version).

  • uv for environment and dependency management.

That is the entire toolchain. Nothing is installed globally.

Related MCP server: mcp-powerpoint

Setup

git clone <this-repo-url> power-point-mcp
cd power-point-mcp
uv sync                  # runtime deps into a local .venv
uv sync --group dev      # add pytest for running the test suite

For a step-by-step walkthrough including Claude Desktop wiring and troubleshooting, see SETUP.md.

Configuration

The server is bound to a single PPTX file via environment variables:

Variable

Required

Purpose

PPTX_TARGET

yes

Absolute path to the one .pptx the server may touch.

PPTX_TEMPLATE

no

Absolute path to a .pptx or .potx template, if any.

If PPTX_TARGET is unset, the server refuses to start.

You can put these in a .env file at the repo root (copy .env.example) instead of exporting them every time. os.environ wins over .env so a one-off override on the command line still works. Run uv run power-point-mcp --doctor to validate the environment without starting the server.

Running locally

PPTX_TARGET=/abs/path/to/deck.pptx \
PPTX_TEMPLATE=/abs/path/to/template.pptx \
uv run power-point-mcp

The server speaks MCP over stdio (FastMCP's default transport).

Claude Desktop configuration

Add an entry like this to your Claude Desktop MCP config:

{
  "mcpServers": {
    "power-point-mcp": {
      "command": "uv",
      "args": ["run", "power-point-mcp"],
      "env": {
        "PPTX_TARGET": "/abs/path/to/deck.pptx",
        "PPTX_TEMPLATE": "/abs/path/to/template.pptx"
      }
    }
  }
}

Tools exposed

  • presentation_info() — slide count, dimensions, layouts, master.

  • list_slides() — index, layout, title, text snippet for every slide.

  • list_layouts() — name, idx, and placeholder names for every layout.

  • read_slide(slide_index) — every shape on one slide, with its text.

  • create_presentation_from_template(overwrite=False) — initialise the bound target from PPTX_TEMPLATE.

  • add_slide(layout_name, placeholders) — append a slide using a named layout; only fills placeholders you supply.

  • set_slide_placeholder(slide_index, placeholder_name, text) — set a placeholder on an existing slide by name.

  • set_slide_placeholder_by_idx(slide_index, placeholder_idx, text) — set a placeholder by its layout idx.

  • set_slide_title(slide_index, text) — set the title placeholder of a slide.

  • delete_slide(slide_index) — remove a slide.

  • reorder_slide(slide_index, new_index) — move a slide to a new position.

Pair this server with the academic-pptx-skill. It provides the slide-design conventions and prompts; this MCP gives Claude the file-system hands to actually write the deck.

Security note

The server only ever reads or writes PPTX_TARGET. Every path the tools receive is routed through a single security check that compares it against the bound target and rejects anything else. There is no network code in the package.

Development

uv sync --group dev
uv run pytest

See docs/architecture.md for the layering and where to add new tools.

Available Tools

10 tools
add_slideB

Add a slide using layout_name; fill ONLY supplied placeholders.

Inputs: layout_name (required), placeholders. Returns: result

create_presentation_from_templateC

Create the bound target file from PPTX_TEMPLATE.

Inputs: overwrite. Returns: result

delete_slideC

Remove a slide from the bound presentation.

Inputs: slide_index (required). Returns: result

list_slidesA

List every slide with its layout, title, and a short text snippet.

Inputs: no named parameters. Returns: result

presentation_infoA

Return high-level facts about the bound presentation.

Inputs: no named parameters. Returns: result

read_slideC

Return shape-level details for a single slide.

Inputs: slide_index (required). Returns: result

reorder_slideC

Move a slide to a new position.

Inputs: slide_index (required), new_index (required). Returns: result

set_slide_placeholderC

Set a placeholder on an existing slide by its name.

Inputs: slide_index (required), placeholder_name (required), text (required). Returns: result

set_slide_placeholder_by_idxC

Set a placeholder on an existing slide by its layout idx.

Inputs: slide_index (required), placeholder_idx (required), text (required). Returns: result

set_slide_titleC

Set the title placeholder of a slide.

Inputs: slide_index (required), text (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3/5.0

    Scored across 10 tools

    Disambiguation4/5

    Most tools have distinct purposes, but set_slide_placeholder and set_slide_placeholder_by_idx could cause confusion as both set placeholders via different identifiers; however, descriptions clarify the difference.

    Naming Consistency4/5

    Tools follow a consistent verb_noun pattern in snake_case, e.g., add_slide, delete_slide. The exception is presentation_info, which lacks a verb, but overall the naming is predictable.

    Tool Count5/5

    10 tools cover the essential operations for PowerPoint slide management (create, read, update, delete, reorder) without being excessive or sparse for the domain.

    Completeness3/5

    The set covers core slide lifecycle and placeholder manipulation, but lacks tools for adding custom shapes, images, or saving/exporting, which may be needed for full PowerPoint editing.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers