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
Metadata
Release files for chuk-mcp-pptx 0.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| chuk_mcp_pptx-0.4.tar.gz | 24.1 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| chuk_mcp_pptx-0.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 36.1 MB
Release files / chuk_mcp_pptx-0.4.tar.gz
| Download URL | chuk_mcp_pptx-0.4.tar.gz |
|---|---|
| Size | 24.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
266d5d1badd70f50613306163cd66d4f6dbb86b541271204c42d4fb8fb1d1d15
|
|
BLAKE2b-256 checksum How to use checksums |
d3d9de4cc092318ebb22b72cc64d13c0412cb8fc38febe50d5cfad69307c1b12
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.2
|
Release files / chuk_mcp_pptx-0.4-py3-none-any.whl
| Download URL | chuk_mcp_pptx-0.4-py3-none-any.whl |
|---|---|
| Size | 12.0 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4958cc21cf6166c40ab927da3b25bb2042e12016e8fd4dfdf0815e8b2ce4c88b
|
|
BLAKE2b-256 checksum How to use checksums |
6147481789d9e66fb9c982e2b290af75d712b491b21835374c3b2066ffd6cfc9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.2
|