{"_id":"@botrun/mcp-ppt-generator","_rev":"2-bbc01490906fa8c8328d1d3eb42886b1","name":"@botrun/mcp-ppt-generator","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@botrun/mcp-ppt-generator","version":"1.0.0","keywords":["mcp","powerpoint","pptx","markdown","presentation"],"author":"","license":"MIT","_id":"@botrun/mcp-ppt-generator@1.0.0","maintainers":[{"name":"aidoer","email":"aidoer@hotmail.com"},{"name":"bigcookie","email":"bigcookie.lee@cameo.tw"},{"name":"hsiehchenwei","email":"Hsiehchenwei@gmail.com"}],"bin":{"generate-pptx":"dist/cli/generate.js","mcp-ppt-generator":"dist/index.js"},"dist":{"shasum":"f6bdf8fefafae406daf8fe0d3e5e831da271b8d0","tarball":"https://registry.npmjs.org/@botrun/mcp-ppt-generator/-/mcp-ppt-generator-1.0.0.tgz","fileCount":18,"integrity":"sha512-lCmKT/IzVfgg5MkusbUwG8oaD7+6tKfEr3YYBErshYaD66X+igAWF+1/CXPQ8Arp7eAwCS92/rUS6d4gyZj8Mw==","signatures":[{"sig":"MEYCIQDKEaOY9ClH7CrXvFjqeJGJ8SivEVF2APqW4oCA0LQRWAIhAOLHD0Z5ofZQpHvkwKB21Mjmw9Fl7UA2v0wMYjIpAaI+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98917},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"0aed2f5e8f9225caeca6b6164911bccd221fa356","scripts":{"dev":"tsc --watch","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js"},"_npmUser":{"name":"bigcookie","email":"bigcookie.lee@cameo.tw"},"_npmVersion":"10.9.2","description":"MCP Server for converting Markdown to PowerPoint presentations","directories":{},"_nodeVersion":"22.16.0","dependencies":{"zod":"^3.22.0","pptxgenjs":"^3.12.0","@xmldom/xmldom":"^0.9.8","pptx-automizer":"^0.8.1","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.0","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-ppt-generator_1.0.0_1769007333658_0.635991394194839","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@botrun/mcp-ppt-generator","version":"1.0.1","description":"MCP Server for converting Markdown to PowerPoint presentations","type":"module","main":"dist/index.js","bin":{"mcp-ppt-generator":"dist/index.js","generate-pptx":"dist/cli/generate.js"},"scripts":{"build":"tsc","start":"node dist/index.js","dev":"tsc --watch","inspect":"npx @modelcontextprotocol/inspector node dist/index.js"},"keywords":["mcp","powerpoint","pptx","markdown","presentation"],"author":"","license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"1.29.0","@xmldom/xmldom":"0.9.9","pptx-automizer":"0.8.1","pptxgenjs":"3.12.0","zod":"3.25.76"},"devDependencies":{"@types/node":"20.19.30","typescript":"5.9.3"},"gitHead":"9e44e1954fe961b4f5f80a6196bc3c1f2e1d437c","types":"./dist/index.d.ts","_id":"@botrun/mcp-ppt-generator@1.0.1","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-8+2S7+laFYozfEcaWoyxQ75AVixYI/L8jjo2UXk+isBLieN+onWUdyuzbiVffEbj2Db0lhQsUV9iBZigL6UDXg==","shasum":"b7b8cd37c360ba613d08cc47da6144aea0ab93d5","tarball":"https://registry.npmjs.org/@botrun/mcp-ppt-generator/-/mcp-ppt-generator-1.0.1.tgz","fileCount":18,"unpackedSize":99981,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDr453chmxMif9doe28EYVgA3AgVhHHZk2xSAQPI+MtWwIhAP07Z2Zyk2CPRLoETgUBO6DVoVAF1UxHCE2UUx8SB3cG"}]},"_npmUser":{"name":"bigcookie","email":"bigcookie.lee@cameo.tw"},"directories":{},"maintainers":[{"name":"aidoer","email":"aidoer@hotmail.com"},{"name":"bigcookie","email":"bigcookie.lee@cameo.tw"},{"name":"hsiehchenwei","email":"Hsiehchenwei@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-ppt-generator_1.0.1_1775098494199_0.9449779637985458"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-21T14:55:33.560Z","modified":"2026-04-02T02:54:54.498Z","1.0.0":"2026-01-21T14:55:33.797Z","1.0.1":"2026-04-02T02:54:54.343Z"},"license":"MIT","keywords":["mcp","powerpoint","pptx","markdown","presentation"],"description":"MCP Server for converting Markdown to PowerPoint presentations","maintainers":[{"name":"aidoer","email":"aidoer@hotmail.com"},{"name":"bigcookie","email":"bigcookie.lee@cameo.tw"},{"name":"hsiehchenwei","email":"Hsiehchenwei@gmail.com"}],"readme":"# MCP PPT Generator\r\n\r\n一個基於 Model Context Protocol (MCP) 的 PowerPoint 簡報產生器，讓 AI 助手能夠使用外部 PPTX 模板產生專業簡報。\r\n\r\n## 專案目的\r\n\r\n在實際工作場景中，使用者經常需要：\r\n\r\n1. **懶人模式**：請 AI 搜尋資料後直接產出簡報\r\n2. **文字轉簡報**：將一段文字（整理過或未整理過）轉換為簡報\r\n3. **套用模板**：使用機關或公司的制式模板（如 Slidesgo 模板）產出簡報\r\n\r\n本專案提供：\r\n- **MCP Server**：讓 Claude 等 AI 助手能夠直接產生 PPTX 檔案\r\n- **Claude Code Skills**：提供 `/create-ppt` 和 `/analyze-template` 智能引導流程\r\n\r\n## 功能特色\r\n\r\n- **外部模板支援**：使用任何 PPTX 模板（如 Slidesgo、公司模板）\r\n- **智能文字替換**：保留原始樣式和動畫，只替換文字內容\r\n- **模板分析**：自動分析模板結構，識別投影片類型\r\n- **簡化 API**：新架構只需指定「元素名稱 → 新文字」\r\n- **內建模板**：提供 Professional 和 Clean 兩種內建樣式\r\n\r\n## 安裝\r\n\r\n```bash\r\n# 複製專案\r\ngit clone https://github.com/anthropics/mcp-ppt-generator.git\r\ncd mcp-ppt-generator\r\n\r\n# 安裝依賴\r\nnpm install\r\n\r\n# 編譯\r\nnpm run build\r\n```\r\n\r\n## 使用方式\r\n\r\n### 整合至 Claude Code（推薦）\r\n\r\n#### 步驟 1：新增 MCP Server\r\n\r\n```bash\r\nclaude mcp add ppt-generator node /path/to/mcp-ppt-generator/dist/index.js \\\r\n  -e PPT_TEMPLATE_DIR=/path/to/mcp-ppt-generator/templates \\\r\n  -e PPT_OUTPUT_DIR=/path/to/mcp-ppt-generator/output\r\n```\r\n\r\n#### 步驟 2：安裝 Skills\r\n\r\n```bash\r\n# 複製到專案目錄\r\nmkdir -p .claude/skills\r\ncp -r /path/to/mcp-ppt-generator/skills/* .claude/skills/\r\n```\r\n\r\n#### 步驟 3：使用\r\n\r\n重啟 Claude Code 後：\r\n\r\n```bash\r\n# 首次使用外部模板，先分析模板\r\n/analyze-template My-Template-Name\r\n\r\n# 產生簡報\r\n/create-ppt\r\n```\r\n\r\n### 整合至 Claude Desktop\r\n\r\n編輯 Claude Desktop 設定檔：\r\n\r\n**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\r\n**Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"ppt-generator\": {\r\n      \"command\": \"node\",\r\n      \"args\": [\"/path/to/mcp-ppt-generator/dist/index.js\"],\r\n      \"env\": {\r\n        \"PPT_TEMPLATE_DIR\": \"/path/to/your/templates\",\r\n        \"PPT_OUTPUT_DIR\": \"/path/to/output\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n## MCP Tools\r\n\r\n### `slides_to_pptx`（推薦）\r\n\r\n使用 slides.json 格式產生簡報，適用於外部模板。\r\n\r\n**參數**：\r\n\r\n| 參數 | 類型 | 必填 | 說明 |\r\n|------|------|------|------|\r\n| `slides_file` | string | ✅ | slides.json 檔案路徑 |\r\n| `save_file_path` | string | | 指定輸出檔案的完整路徑 |\r\n\r\n**slides.json 格式**：\r\n\r\n```json\r\n{\r\n  \"template\": \"My-Template-Name\",\r\n  \"slides\": [\r\n    {\r\n      \"useSlide\": 1,\r\n      \"replacements\": {\r\n        \"Shape 7079\": \"我的標題\",\r\n        \"Shape 7081\": \"副標題文字\"\r\n      }\r\n    },\r\n    {\r\n      \"useSlide\": 3,\r\n      \"replacements\": {\r\n        \"Shape 8785\": \"01\",\r\n        \"Shape 8786\": \"專案概述\",\r\n        \"Shape 8787\": \"02\",\r\n        \"Shape 8788\": \"市場分析\"\r\n      }\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n**回傳**：\r\n\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"message\": \"簡報產生成功\",\r\n  \"file_path\": \"/path/to/output/presentation.pptx\",\r\n  \"filename\": \"presentation.pptx\",\r\n  \"slides_count\": 5,\r\n  \"template\": \"My-Template-Name\"\r\n}\r\n```\r\n\r\n### `list_templates`\r\n\r\n列出所有可用的簡報模板（包含內建和外部模板）。\r\n\r\n**回傳**：\r\n\r\n```json\r\n{\r\n  \"template_directory\": \"/path/to/templates\",\r\n  \"built_in_templates\": [\r\n    { \"id\": \"professional\", \"name\": \"Professional\", \"type\": \"built-in\" },\r\n    { \"id\": \"clean\", \"name\": \"Clean\", \"type\": \"built-in\" }\r\n  ],\r\n  \"external_templates\": [\r\n    { \"id\": \"My-Template-Name\", \"name\": \"My-Template-Name\", \"type\": \"external\" }\r\n  ]\r\n}\r\n```\r\n\r\n### `analyze_template`\r\n\r\n分析外部 PPTX 模板的結構，提取每張投影片的元素資訊並儲存到檔案。\r\n\r\n**參數**：\r\n\r\n| 參數 | 類型 | 必填 | 說明 |\r\n|------|------|------|------|\r\n| `template` | string | ✅ | 外部模板名稱（不含 .pptx） |\r\n| `output_file` | string | ✅ | 輸出檔案路徑 |\r\n\r\n**回傳**：\r\n\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"message\": \"模板分析完成\",\r\n  \"output_file\": \"templates/My-Template/elements.json\",\r\n  \"totalSlides\": 57\r\n}\r\n```\r\n\r\n### `markdown_to_pptx`\r\n\r\n將 Markdown 檔案轉換為 PPTX 簡報（舊架構，適用於內建模板）。\r\n\r\n**參數**：\r\n\r\n| 參數 | 類型 | 必填 | 說明 |\r\n|------|------|------|------|\r\n| `markdown_file` | string | ✅ | Markdown 檔案路徑 |\r\n| `template` | string | | 模板名稱（預設：professional） |\r\n| `config_file` | string | | 設定檔路徑（外部模板時必填） |\r\n| `save_file_path` | string | | 指定輸出檔案的完整路徑 |\r\n| `filename` | string | | 輸出檔名（預設：presentation） |\r\n\r\n## Claude Code Skills\r\n\r\n### `/analyze-template`\r\n\r\n首次使用外部模板前，執行此 skill 來分析模板結構。\r\n\r\n**功能**：\r\n1. 將 PPTX 轉換為 PDF 和 PNG 預覽圖\r\n2. 提取所有投影片的元素資訊（elements.json）\r\n3. 使用 Gemini 分析投影片類型（analysis.json）\r\n\r\n**使用方式**：\r\n\r\n```bash\r\n/analyze-template My-Template-Name\r\n```\r\n\r\n**輸出檔案**：\r\n\r\n```\r\ntemplates/My-Template-Name/\r\n├── preview.pdf           # PDF 預覽\r\n├── elements.json         # 元素資訊（元素名稱、原始文字）\r\n├── analysis.json         # 類型資訊（title/toc/section/content/closing）\r\n└── slides/\r\n    ├── slide-001.png     # PNG 預覽圖\r\n    ├── slide-002.png\r\n    └── ...\r\n```\r\n\r\n**環境需求**：\r\n- LibreOffice（用於 PPTX → PDF 轉換）\r\n- `GEMINI_API_KEY` 環境變數（用於 AI 分析投影片類型）\r\n\r\n### `/create-ppt`\r\n\r\n智能簡報製作助手，引導用戶產生簡報。\r\n\r\n**流程**：\r\n1. 列出可用模板\r\n2. 讀取 analysis.json 了解投影片類型\r\n3. 讀取 elements.json 了解元素名稱\r\n4. 根據用戶內容規劃結構\r\n5. 建立 slides.json\r\n6. 呼叫 `slides_to_pptx` 產生簡報\r\n\r\n**使用方式**：\r\n\r\n```bash\r\n/create-ppt\r\n\r\n# 或直接說需求\r\n「幫我做一份關於 2025 旅遊趨勢的簡報」\r\n```\r\n\r\n## 工作流程\r\n\r\n### 新架構流程（推薦）\r\n\r\n```\r\n1. 放置 PPTX 模板到 templates/ 目錄\r\n\r\n2. /analyze-template My-Template\r\n   → 產生 elements.json（元素名稱）\r\n   → 產生 analysis.json（投影片類型）\r\n\r\n3. /create-ppt\r\n   → AI 讀取 analysis.json 選擇適當的投影片\r\n   → AI 讀取 elements.json 取得元素名稱\r\n   → 建立 slides.json\r\n   → 呼叫 slides_to_pptx 產生簡報\r\n```\r\n\r\n### 檔案說明\r\n\r\n| 檔案 | 產生方式 | 用途 |\r\n|------|----------|------|\r\n| `elements.json` | `analyze_template` MCP 工具 | 記錄元素名稱和原始文字 |\r\n| `analysis.json` | Gemini 分析 PDF | 記錄投影片類型和建議 |\r\n| `slides.json` | AI 產生 | 定義要產生的投影片內容 |\r\n\r\n## 環境變數\r\n\r\n| 變數 | 說明 | 預設值 |\r\n|------|------|--------|\r\n| `PPT_TEMPLATE_DIR` | 外部模板目錄 | `./templates` |\r\n| `PPT_OUTPUT_DIR` | 輸出目錄 | `./output` |\r\n| `GEMINI_API_KEY` | Gemini API 金鑰（analyze-template skill 需要） | - |\r\n\r\n## 專案結構\r\n\r\n```\r\nmcp-ppt-generator/\r\n├── src/\r\n│   ├── index.ts                    # MCP Server 主程式\r\n│   ├── parser/\r\n│   │   └── index.ts                # Markdown 解析器\r\n│   ├── generator/\r\n│   │   ├── index.ts                # 內建模板產生器 (PptxGenJS)\r\n│   │   └── template-generator.ts   # 外部模板產生器 (pptx-automizer)\r\n│   ├── analyzer/\r\n│   │   └── index.ts                # 模板分析器\r\n│   └── templates/\r\n│       └── index.ts                # 內建模板定義\r\n├── skills/\r\n│   ├── create-ppt/\r\n│   │   └── SKILL.md                # 簡報製作 skill\r\n│   └── analyze-template/\r\n│       ├── SKILL.md                # 模板分析 skill\r\n│       └── scripts/\r\n│           ├── extract-elements.mjs      # 元素提取腳本\r\n│           └── analyze-pdf-with-gemini.mjs  # Gemini 分析腳本\r\n├── templates/                      # 外部 PPTX 模板目錄\r\n├── output/                         # 輸出目錄\r\n├── package.json\r\n├── tsconfig.json\r\n└── README.md\r\n```\r\n\r\n## 技術棧\r\n\r\n- **Runtime**: Node.js 18+\r\n- **Language**: TypeScript 5+\r\n- **MCP SDK**: @modelcontextprotocol/sdk\r\n- **PPTX 產生**:\r\n  - [PptxGenJS](https://github.com/gitbrent/PptxGenJS) - 內建模板\r\n  - [pptx-automizer](https://github.com/singerla/pptx-automizer) - 外部模板\r\n- **PPTX 分析**: JSZip\r\n- **Schema 驗證**: Zod\r\n- **AI 分析**: Google Gemini API\r\n\r\n## 開發\r\n\r\n```bash\r\n# 開發模式（監聽檔案變更）\r\nnpm run dev\r\n\r\n# 編譯\r\nnpm run build\r\n\r\n# 使用 MCP Inspector 測試\r\nnpm run inspect\r\n```\r\n\r\n## 已知限制\r\n\r\n1. **文字樣式**：使用 `setText` 方法，多段落文字可能會失去部分樣式\r\n2. **圖片支援**：圖片功能尚在開發中\r\n3. **複雜動畫**：複雜的動畫效果可能無法完整保留\r\n\r\n## 授權\r\n\r\nMIT License\r\n\r\n## 相關連結\r\n\r\n- [Model Context Protocol](https://modelcontextprotocol.io)\r\n- [Claude Code](https://claude.ai/code)\r\n- [PptxGenJS 文檔](https://gitbrent.github.io/PptxGenJS/)\r\n- [pptx-automizer](https://github.com/singerla/pptx-automizer)\r\n","readmeFilename":"README.md"}