PowerPoint MCP Server - A shadcn-inspired design system for presentations
Project description
Chuk MCP PowerPoint Server
A powerful, LLM-friendly PowerPoint design system with MCP server integration. Built with a template-first architecture, universal component API, and comprehensive theming for creating professional presentations.
Highlights
- Template-First Workflow - Professional templates with 50+ layouts each
- Universal Component API - Single tool for all components (charts, tables, images, etc.)
- Design System - shadcn/ui-inspired component architecture with variants
- Theme System - 15+ built-in themes with dark/light modes
- Component Registry - LLM-friendly schemas and discovery
- Design Tokens - Consistent colors, typography, spacing
- MCP Integration - Full Model Context Protocol support
- Fully Tested - 2395+ tests with comprehensive coverage
- Cloud Ready - Deploy to Fly.io with Tigris S3 and Redis
Project Structure
chuk-mcp-pptx/
├── src/chuk_mcp_pptx/
│ ├── components/ # Component library
│ │ ├── core/ # Core components (Card, Badge, Table, Image, etc.)
│ │ ├── charts/ # Chart components (Column, Line, Pie, Gauge, etc.)
│ │ ├── tracking.py # Component tracking system
│ │ ├── registry.py # Component registry with schemas
│ │ └── base.py # Base component class
│ ├── tools/ # MCP tool implementations
│ │ ├── universal/ # Universal component API
│ │ │ ├── api.py # pptx_add_component, pptx_update_component
│ │ │ ├── registry.py # Component discovery tools
│ │ │ └── semantic.py # Semantic slide tools
│ │ ├── template/ # Template tools
│ │ │ ├── workflow.py # pptx_add_slide_from_template
│ │ │ ├── analyze.py # pptx_analyze_template
│ │ │ └── list.py # pptx_list_templates
│ │ ├── core/ # Core tools (placeholder population)
│ │ ├── theme/ # Theme management tools
│ │ ├── layout/ # Slide layout tools
│ │ └── inspection/ # Slide inspection tools
│ ├── templates/ # Template manager
│ ├── themes/ # Theme system (15+ themes)
│ ├── tokens/ # Design tokens
│ ├── layout/ # Layout helpers
│ ├── slide_templates/ # Pre-built slide templates
│ ├── async_server.py # Async MCP server
│ └── server.py # Server entry point
├── docs/ # Documentation
├── examples/ # Examples and demos (see Golden Path)
├── tests/ # 2395+ comprehensive tests
└── outputs/ # Generated presentations
Features
Core Features
- Create presentations from professional templates (50+ layouts)
- Universal component API for all content types
- Smart placeholder population with automatic content handling
- Template-aware design system resolution
- Save/load presentations, import/export as base64
- Cloud storage with presigned download URLs
Design System Features
- Variant System - cva-inspired composable variants
- Composition Patterns - shadcn-style component composition
- Component Registry - Discovery and documentation for LLMs
- Design Tokens - Colors, typography, spacing tokens
- Theme System - 15+ themes with export/import
- Type Safety - Pydantic schemas for validation
Installation
# Using uv
uv sync
uv run chuk-mcp-pptx
# Or using pip
pip install -e .
MCP Tools Reference
The server provides MCP tools organized into logical groups:
Presentation Management
pptx_create- Create presentation (optionally from template)pptx_list- List all open presentationspptx_switch- Switch between presentationspptx_get_info- Get presentation metadatapptx_delete- Delete a presentationpptx_status- Get server status
Template Workflow (Recommended)
pptx_analyze_template- Analyze template layouts and placeholderspptx_analyze_template_variants- Group similar layoutspptx_add_slide_from_template- Add slide using template layoutpptx_populate_placeholder- Populate placeholders with contentpptx_list_templates- List available templatespptx_get_builtin_template- Get built-in template info
Universal Component API
pptx_add_component- Add any component (charts, tables, images, etc.)pptx_update_component- Update existing componentpptx_list_slide_components- List and validate slide components
Component Registry
pptx_list_components- List all available componentspptx_search_components- Search components by keywordpptx_get_component_schema- Get component schema/propspptx_get_component_variants- Get variant optionspptx_get_component_examples- Get usage examplespptx_export_registry_docs- Export full registry docs
Layout Management
pptx_list_layouts- List available slide layoutspptx_add_slide_with_layout- Add slide with specific layoutpptx_customize_layout- Customize slide appearancepptx_apply_master_layout- Apply master formattingpptx_duplicate_slide- Duplicate existing slidepptx_reorder_slides- Reorder slides
Theme Tools
pptx_list_themes- List available themespptx_get_theme_info- Get theme detailspptx_apply_theme- Apply theme to presentationpptx_create_custom_theme- Create custom themepptx_apply_component_theme- Apply theme to componentpptx_list_component_themes- List component-specific themes
Inspection Tools
pptx_inspect_slide- Detailed slide inspectionpptx_fix_slide_layout- Auto-fix layout issuespptx_analyze_presentation_layout- Full presentation analysis
Semantic Tools
pptx_add_title_slide- Add title slide (deprecated, use templates)pptx_add_slide- Add content slide (deprecated, use templates)
File Operations
pptx_save- Save presentation to diskpptx_export_base64- Export as base64 datapptx_import_base64- Import from base64 datapptx_get_download_url- Get presigned download URL
Recommended Workflow
Template-Based Presentations (Recommended)
The recommended approach uses professional templates for consistent, high-quality presentations:
# 1. Create presentation from a template
await pptx_create(name="quarterly_report", template_name="brand_proposal")
# 2. Analyze template to see ALL available layouts (CRITICAL!)
await pptx_analyze_template("brand_proposal")
# Returns 50+ layouts: Title, Content, Comparison, Quote, Charts, etc.
# 3. Add slides using specific layouts
result = await pptx_add_slide_from_template(layout_index=0) # Title slide
# Response shows: placeholder 0 (TITLE), placeholder 1 (SUBTITLE)
# 4. Populate text placeholders
await pptx_populate_placeholder(slide_index=0, placeholder_idx=0, content="Q4 Report")
await pptx_populate_placeholder(slide_index=0, placeholder_idx=1, content="Financial Results")
# 5. Add content slide with chart
result = await pptx_add_slide_from_template(layout_index=40) # Chart layout
# Response shows: placeholder 2 (CHART)
# 6. Populate chart placeholder with structured data
await pptx_populate_placeholder(
slide_index=1,
placeholder_idx=2,
content={
'type': 'ColumnChart',
'title': 'Revenue by Quarter',
'categories': ['Q1', 'Q2', 'Q3', 'Q4'],
'series': {'Revenue': [100, 120, 140, 180]}
}
)
# 7. Verify slide components
await pptx_list_slide_components(slide_index=1)
# Validates all placeholders are populated, no empty "Click to add" text
# 8. Save presentation
await pptx_save(path="quarterly_report.pptx")
Universal Component API
For adding components anywhere (free-form or into placeholders):
# Add chart into placeholder (template-aware)
await pptx_add_component(
slide_index=1,
component="ColumnChart",
target_placeholder=2,
params={
"title": "Sales Growth",
"categories": ["Jan", "Feb", "Mar"],
"series": {"Sales": [100, 150, 200]}
}
)
# Add table into placeholder
await pptx_add_component(
slide_index=2,
component="Table",
target_placeholder=14,
params={
"headers": ["Product", "Q1", "Q2"],
"data": [["Widget A", "$10K", "$15K"], ["Widget B", "$8K", "$12K"]]
}
)
# Free-form positioning (for blank slides)
await pptx_add_component(
slide_index=3,
component="Badge",
left=2.0, top=3.0, width=1.5, height=0.5,
params={"text": "New", "variant": "success"}
)
Running the Server
The server can run in different transport modes:
# Auto-detect mode (stdio for Claude Desktop, HTTP otherwise)
uv run python -m chuk_mcp_pptx.server
# Force stdio mode
uv run python -m chuk_mcp_pptx.server stdio
# Force HTTP mode on specific port
uv run python -m chuk_mcp_pptx.server http --port 8080
Cloud Deployment (Fly.io)
Deploy the PowerPoint MCP Server to Fly.io with Tigris S3 storage and Redis for production use.
Quick Deploy
# 1. Create the app
fly apps create chuk-mcp-pptx
# 2. Create Tigris S3 bucket for artifact storage
fly storage create
# 3. Create Redis instance
fly redis create --name chuk-mcp-pptx-redis --region lhr --no-replicas --enable-eviction
# 4. Set Redis URL secret (from redis create output)
fly secrets set REDIS_URL="redis://default:password@fly-chuk-mcp-pptx-redis.upstash.io:6379"
# 5. Deploy
fly deploy
Architecture
┌─────────────────────────────────────────────────────────────┐
│ Fly.io Edge │
│ (chuk-mcp-pptx.fly.dev) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ PowerPoint MCP Server │
│ (Python + FastMCP) │
│ │
│ ┌─────────────────┐ ┌─────────────────────────────────┐ │
│ │ Presentation │ │ chuk-artifacts │ │
│ │ Manager │──│ (S3 + Redis backend) │ │
│ └─────────────────┘ └─────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────────────────┐
│ Fly Redis │ │ Tigris S3 │
│ (Upstash managed) │ │ (Object storage) │
│ │ │ │
│ • Session metadata │ │ • Presentation files (.pptx) │
│ • Distributed lock │ │ • Exported artifacts │
└─────────────────────┘ └─────────────────────────────────┘
Environment Variables
| Variable | Description | Set Via |
|---|---|---|
CHUK_ARTIFACTS_PROVIDER |
Storage provider (s3) |
fly.toml |
AWS_ACCESS_KEY_ID |
Tigris access key | secrets |
AWS_SECRET_ACCESS_KEY |
Tigris secret key | secrets |
AWS_ENDPOINT_URL_S3 |
Tigris endpoint | secrets |
BUCKET_NAME |
S3 bucket name | secrets |
REDIS_URL |
Redis connection URL | secrets |
GitHub Actions Auto-Deploy
Add FLY_API_TOKEN to your repository secrets for automatic deployment on push to main:
fly tokens create deploy -x 999999h
The included .github/workflows/fly-deploy.yml handles automatic deployment.
Getting Download URLs
When deployed to Fly.io with S3 storage, use pptx_get_download_url to get presigned URLs:
# Create and save a presentation
pptx_create(name="report")
pptx_add_title_slide(title="Q4 Report")
# Get a download URL (valid for 1 hour by default)
result = pptx_get_download_url()
# Returns: {"url": "https://fly.storage.tigris.dev/...", "expires_in": 3600}
# Custom expiration (2 hours)
result = pptx_get_download_url(expires_in=7200)
For detailed deployment instructions, see FLY_DEPLOYMENT.md.
Storage Configuration
The server uses chuk-artifacts for flexible storage with support for multiple backends:
Storage Providers
- memory (default): In-memory storage (for local development)
- file: Local filesystem storage
- sqlite: SQLite database storage
- s3: AWS S3 or S3-compatible storage (Tigris, MinIO, etc.)
Environment-Based Configuration
Storage is configured via environment variables:
# S3/Tigris storage (production)
export CHUK_ARTIFACTS_PROVIDER=s3
export AWS_ACCESS_KEY_ID=your_key
export AWS_SECRET_ACCESS_KEY=your_secret
export AWS_ENDPOINT_URL_S3=https://fly.storage.tigris.dev
export BUCKET_NAME=your-bucket
# Redis for metadata (optional but recommended for S3)
export REDIS_URL=redis://localhost:6379
Artifact Store Integration
The server automatically persists presentations to the configured artifact store:
- Auto-save: Presentations are automatically saved when created or modified
- Auto-load: Presentations are loaded from the store when accessed
- Multi-server: Multiple server instances can share presentations via S3
- Presigned URLs: Generate download URLs for cloud-stored presentations
Storage Patterns
- Artifact Store: All presentations use chuk-artifacts for persistence
- Base64 transfer: Export/import presentations as base64 for transfer
- Presigned URLs: Get direct download links from S3/Tigris storage
- Image support: Add images via file path or base64 data URLs
Available Components
Components available through pptx_add_component and pptx_populate_placeholder:
Charts
ColumnChart,BarChart- Bar/column charts with clustered, stacked, stacked100 variantsLineChart,AreaChart- Line/area charts with smooth, markers variantsPieChart,DoughnutChart- Pie/doughnut charts with exploded variantScatterChart,BubbleChart- Scatter/bubble visualizationsRadarChart- Spider/radar chartsWaterfallChart- Waterfall charts for financial dataFunnelChart- Sales funnel visualizationsGaugeChart- Gauge/speedometer chartsGanttChart- Project timeline chartsHeatmapChart- Heat map visualizationsSparklineChart- Inline mini chartsMatrix3DChart- 3D matrix visualizations
Data
Table- Tables with striped, bordered, compact variantsContentGrid- Grid layout for multiple items
UI Components
Card- Container with header/footerBadge- Status badges (default, secondary, success, warning, destructive)Alert- Alert boxes (default, info, success, warning, error)Button- Buttons (default, secondary, outline, ghost, destructive)Progress- Progress barsAvatar- Avatar/profile imagesIcon- Icon components
Media
Image- Images with various fit modesVideo- Video placeholdersCodeBlock- Syntax-highlighted code
Layout
Container- Content containersStack- Vertical/horizontal stacksTimeline- Timeline visualizationsSmartArt- SmartArt-style diagrams
MCP Configuration
For Claude Desktop, add to your MCP settings:
{
"mcpServers": {
"chuk-mcp-pptx": {
"command": "uv",
"args": ["run", "python", "-m", "chuk_mcp_pptx.server"],
"cwd": "/path/to/chuk-mcp-pptx"
}
}
}
Quick Start
Via MCP (Recommended)
When connected via MCP client (Claude Desktop, etc.):
# Create from template
await pptx_create(name="my_deck", template_name="brand_proposal")
# Analyze available layouts
await pptx_analyze_template("brand_proposal")
# Add and populate slides
await pptx_add_slide_from_template(layout_index=0)
await pptx_populate_placeholder(slide_index=0, placeholder_idx=0, content="Welcome")
# Save
await pptx_save(path="my_deck.pptx")
Direct Python Usage
from pptx import Presentation
from chuk_mcp_pptx.components.core import Card, Table
from chuk_mcp_pptx.components.charts import ColumnChart
from chuk_mcp_pptx.themes import ThemeManager
# Create presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
# Apply theme
theme_mgr = ThemeManager()
theme = theme_mgr.get_theme("dark-violet")
theme.apply_to_slide(slide)
# Add a chart
chart = ColumnChart(
title="Revenue by Quarter",
categories=["Q1", "Q2", "Q3", "Q4"],
series={"Revenue": [100, 150, 200, 250]},
theme=theme.__dict__
)
chart.render(slide, left=1, top=1.5, width=8, height=4)
# Add a table
table = Table(
headers=["Product", "Sales", "Growth"],
data=[
["Widget A", "$50K", "+15%"],
["Widget B", "$30K", "+8%"],
],
variant="striped",
theme=theme.__dict__
)
table.render(slide, left=1, top=5.5, width=8, height=1.5)
prs.save("output.pptx")
Golden Path Examples
The examples/ directory contains canonical demonstrations of the optimal workflow:
Golden Path Pitch Deck
uv run python examples/golden_path_pitch_deck.py
Creates an 8-slide pitch deck demonstrating:
- Template-first workflow with
brand_proposaltemplate - Chart components (Column, Line, Pie, Bar)
- Table components with variants
- Proper placeholder population
- Theme application
Output: examples/output_pitch_deck.pptx
Golden Path Prompts
See examples/GOLDEN_PATH_PROMPTS.md for three canonical demo prompts:
- Startup Pitch Deck (8 slides) - Full workflow example
- Quarterly Business Review (10 slides) - Charts and tables
- Technical Tutorial (6 slides) - Code examples and diagrams
These prompts show the expected MCP tool-call sequences for common presentation types.
Documentation
Testing
Run All Tests
# All 2395+ tests
uv run pytest tests/ -v
# Or use make
make test
# Full check (lint, typecheck, security, tests)
make check
Test Suites
uv run pytest tests/components/ -v # Component tests
uv run pytest tests/components/charts/ -v # Chart component tests
uv run pytest tests/tools/ -v # MCP tools tests
uv run pytest tests/layout/ -v # Layout tests
uv run pytest tests/themes/ -v # Theme tests
Total: 2395+ tests, all passing
Dependencies
python-pptx- PowerPoint file creation and manipulationchuk-mcp-server- MCP server frameworkchuk-artifacts- Flexible artifact storage (memory, file, sqlite, s3)mcp- Model Context Protocol implementationpydantic- Schema validationaiobotocore- Async S3 client (for cloud deployments)redis- Redis client (for distributed deployments)pytest- Testing framework
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chuk_mcp_pptx-0.4.tar.gz.
File metadata
- Download URL: chuk_mcp_pptx-0.4.tar.gz
- Upload date:
- Size: 24.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
266d5d1badd70f50613306163cd66d4f6dbb86b541271204c42d4fb8fb1d1d15
|
|
| MD5 |
f3e274f10e19524ecfd14c0d39d5bd29
|
|
| BLAKE2b-256 |
d3d9de4cc092318ebb22b72cc64d13c0412cb8fc38febe50d5cfad69307c1b12
|
File details
Details for the file chuk_mcp_pptx-0.4-py3-none-any.whl.
File metadata
- Download URL: chuk_mcp_pptx-0.4-py3-none-any.whl
- Upload date:
- Size: 12.0 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4958cc21cf6166c40ab927da3b25bb2042e12016e8fd4dfdf0815e8b2ce4c88b
|
|
| MD5 |
2ff8d4a36ed89d83c1603722908aea88
|
|
| BLAKE2b-256 |
6147481789d9e66fb9c982e2b290af75d712b491b21835374c3b2066ffd6cfc9
|