deckproof-mcp
Creates, validates, audits, and repairs PowerPoint .pptx files against the OOXML spec, allowing users to generate spec-compliant slides from templates.
README
deckproof-mcp
Bring your own PowerPoint template - get spec-clean slides back. A Model Context Protocol server that creates, validates, audits, and repairs .pptx files against the real OOXML / ECMA-376 (ISO/IEC 29500) PresentationML spec.
Point it at your company deck; it adds new slides that match your existing masters, layouts, theme, and branding - and every file it hands back is validated against the same structural checklist it uses to inspect other people's files. Fully local. No API keys.
Why this exists
LLM-driven and library-driven PowerPoint generation quietly produces broken files. They open fine in PowerPoint (which silently self-heals on load) and then fail to import into Apple Keynote, Google Slides, or Apache POI - because those readers are strict about the spec.
This isn't hypothetical:
- Anthropic's own
/pptxskill shipped files that fail to open in Keynote (anthropics/skills#1167) - root-caused to a stalesldSzattribute, a missingnotesMasterIdLst, and a Windows-only embedded part. - PptxGenJS passes invalid shape presets straight through, and its
defineSlideMastercan write malformed[Content_Types].xmlon multi-slide decks. - pptx-automizer (the template-cloning engine used here) can leave dangling relationships and unregistered slide IDs.
deckproof-mcp treats the OOXML spec as the source of truth: it generates against it, checks against it, and repairs to it. Creation is self-certifying - every generated or repaired file is run back through the validator before it is returned.
Install
Run it from npm with npx (no install needed) and register it with your MCP client:
{
"mcpServers": {
"deckproof": {
"command": "npx",
"args": ["-y", "deckproof-mcp"]
}
}
}
Running from source (before the npm package is published, or to hack on it): clone this repo,
npm install && npm run build, then point your client at"command": "node", "args": ["/absolute/path/to/deckproof-mcp/dist/index.js"].
Tools
| Tool | What it does |
|---|---|
pptx_list_layouts |
List the 15 built-in layout archetypes. Pass a template to also list that file's slides (with placeholder types) so you can pick stencils. |
pptx_create_deck |
Build a deck - from your uploaded template (clone + refill, branding inherited) or from a neutral theme. Self-certifying. |
pptx_validate |
Structural pass/fail for any .pptx against the 14-rule OOXML checklist. |
pptx_audit |
Validation plus advisory metrics: alt-text coverage, orphaned/duplicate media, counts, and per-viewer portability risk. |
pptx_repair |
Auto-fix an existing .pptx's structural problems and report what could not be fixed safely. |
Files are returned as a base64 resource block (correct PresentationML MIME type) plus a text summary; structured JSON reports come back in structuredContent.
Bring-your-own-template workflow
- Call
pptx_list_layoutswith your company.pptxastemplate. You get back its slides, each with anindexand its placeholder types. - Call
pptx_create_deckwith the sametemplateand aslidesarray. For each slide, choose anarchetype(the content shape) and astencilSlideIndex(which of your template's slides to clone for its look). - Text archetypes (cover, agenda, bullets, quote, ...) refill the cloned slide's placeholders. Rich archetypes (tables, timeline, org chart, matrix, ...) keep the cloned slide's branded chrome and generate their content on top, styled with colors pulled from your template's theme.
New slides are appended after your template's existing slides (this preserves spec-correctness), so your template must contain at least one slide to clone. Omit template entirely to build a fresh deck on a neutral theme.
The 15 layout archetypes
cover, agenda, contentBullets, twoColumns, quote, sectionDivider, closingNextSteps, comparisonTable, dataTable, timeline, statsBanner, cardGrid, orgChart, matrixQuadrant, verticalSteps.
What gets validated (14 rules)
Structural errors (gate valid): dangling relationships; missing presentation ID-list registrations (sldIdLst / sldMasterIdLst / notesMasterIdLst); content-type completeness; stale/contradictory sldSz; slide-layout-master inheritance; duplicate slide IDs; theme color-map breakage; orphaned master/layout chains; duplicate relationship IDs; unregistered slide/layout/master/theme parts.
Advisory warnings (surfaced by pptx_audit): Windows-only platform parts; orphaned media; missing picture alt-text; duplicate media bloat.
Deploying remotely (Streamable HTTP)
The same binary also speaks Streamable HTTP so it can run as a deployable service. node dist/index.js picks the transport at runtime:
- no
PORT/MCP_TRANSPORT→ stdio (thenpxdefault). PORTset (most PaaS set this automatically), orMCP_TRANSPORT=http→ Streamable HTTP atPOST /mcp, with aGET /healthzcheck.
The HTTP server is stateless (fresh server per request) - safe because every tool call is a pure function of its inputs; the uploaded template travels in the request bytes, not in server state.
npm run build
npm run start:http # MCP_TRANSPORT=http PORT=3000 node dist/index.js
# or:
docker build -t deckproof-mcp .
docker run -p 3000:3000 deckproof-mcp
Environment variables (HTTP mode)
| Variable | Default | Purpose |
|---|---|---|
PORT |
3000 |
Port to listen on (setting it alone switches to HTTP mode). |
MCP_TRANSPORT |
(unset) | Set to http to force HTTP mode without PORT. |
HOST |
0.0.0.0 |
Interface to bind. |
MCP_ALLOWED_HOSTS |
(unset) | Comma-separated allowed Host header values (DNS-rebinding protection). |
Security
This server ingests untrusted .pptx uploads, so it is hardened accordingly:
pathinput is stdio-only. Reading a file from a local path is allowed only on the local stdio transport. Over HTTP thepathinput is rejected (local-file-read / SSRF protection) - remote callers must passbase64.- Input limits. Uploads over 50 MB are rejected; packages that decompress past 300 MB are refused (zip-bomb guard); a single call is capped at 200 slides.
- XML entity expansion is disabled (no "billion laughs" amplification on crafted parts).
- No built-in authentication. These tools are read-only pure computations with no network or credential access, but if you expose the HTTP server beyond a trusted network, put it behind a gateway that handles auth and set
MCP_ALLOWED_HOSTS.
Development
npm install
npm run build # tsc -> dist/
npm test # build + vitest (engine, tools, HTTP tiers)
npm run inspect # MCP Inspector against the built server
Architecture: pure, dependency-free logic in src/engine/ (OPC package model, one file per validation rule, sanitizer, layout composers) with thin MCP wrappers in src/tools/. Tests build their fixtures in code (no checked-in binaries), so they never drift from what the engine emits.
How it works
jszip+fast-xml-parsermodel the.pptxas an OPC package; every rule and fixer operates on that model, never raw bytes.pptxgenjsbuilds from-scratch slides;pptx-automizerclones template stencils and refills placeholders (targeting them by standard placeholder type +nameIdx, robust to duplicate element names).- The validator runs 14 pure
(package) => violations[]rules; the sanitizer runs the safe subset as fixers and re-validates.
License
MIT - see LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。