PowerPoint MCP

English version

Python License Platform Downloads

WindowsとmacOSで動くPowerPointのリアルタイム制御 —
AIエージェントと開発者のための156ツールを備えたMCPサーバー

--- 起動中のPowerPointを完全に制御するMCP(Model Context Protocol)サーバーです。WindowsではCOM、macOSではApple Events経由で操作します。python-pptxのようなファイルベースのライブラリとは異なり、起動中のPowerPointアプリケーションと直接やり取りします。 ## 🎬 デモ エージェントが実際の PowerPoint ウィンドウでスライドを作成する様子(15倍速): https://github.com/user-attachments/assets/178b9b5b-624d-4de0-a1dd-619dc13d4bd7 ## ✨ 主な特徴 - **リアルタイム制御** — 起動中のPowerPointを直接操作。変更がその場で画面に反映される - **26カテゴリ・156ツール** — スライド、シェイプ、テキスト、テーブル、グラフ、アニメーション、SmartArt、メディア、フリーフォームパスなど - **AIエージェントに安全** — `ppt_activate_presentation` で操作対象ファイルを固定。誤って別のプレゼンを編集するミスを防止 - **[Google Material Symbols](https://fonts.google.com/icons) アイコン** — 2,500以上のアイコンをキーワード検索し、テーマカラーでSVG挿入 - **テーマカラー連携** — RGB値のハードコードではなく `accent1`、`accent2` などのテーマカラー名で指定 - **WindowsとmacOSに対応** — ツール名も引数も返り値も両者で同一。PowerPoint for Macで届かない操作は、黙って何もせずそう答える ## 📋 動作環境 - Windows 11、または macOS(Apple Silicon と Intel のどちらも可) - Microsoft PowerPoint - [uv](https://docs.astral.sh/uv/getting-started/installation/) macOS では COM ではなく Apple Event で PowerPoint を動かします。最初のツール 呼び出しで OS の自動化の許可を求めるダイアログが出るので、そこで PowerPoint を 一度許可してください。違いは [macOS 対応](#-macos-対応) にまとめてあります。 ## 🚀 はじめかた ほとんどの MCP クライアント(Claude Desktop、Cursor、`.mcp.json` など)で使える標準設定: ```json { "mcpServers": { "powerpoint": { "command": "uvx", "args": ["ppt-mcp"] } } } ``` ### Claude Code **ユーザースコープ**(全プロジェクトで利用可能) ```bash claude mcp add powerpoint uvx ppt-mcp ``` **プロジェクトスコープ**(`.mcp.json` に保存、チームで共有可能) ```bash claude mcp add --scope project powerpoint uvx ppt-mcp ``` ### Cursor [![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/install-mcp?name=ppt-mcp&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyJwcHQtbWNwIl19) または `~/.cursor/mcp.json` に上記の標準設定を追加。 ### Claude Desktop `%APPDATA%\Claude\claude_desktop_config.json` に上記の標準設定を追加。 ### Codex `~/.codex/config.toml` を編集: ```toml [mcp_servers.ppt-mcp] command = "uvx" args = ["ppt-mcp"] ``` または上記の標準設定を `.codex/config.json` に記述しても動作します。 ### VS Code ```bash code --add-mcp '{"name":"powerpoint","command":"uvx","args":["ppt-mcp"]}' ``` ### ソースから実行 ```bash git clone https://github.com/ykuwai/ppt-mcp.git cd ppt-mcp uv sync ``` ```json { "mcpServers": { "powerpoint": { "command": "uv", "args": [ "--directory", "C:\\path\\to\\ppt-mcp", "run", "mcp", "run", "src/server.py" ] } } } ``` ## 🛠️ ツール一覧 | カテゴリ | ツール数 | 主な機能 | |---------|-------:|---------| | **アプリケーション** | 5 | PowerPoint接続、アプリ情報、アクティブウィンドウ、ウィンドウ状態、プレゼン一覧 | | **プレゼンテーション** | 8 | 作成(テンプレート対応)、開く(ローカルファイル、Windows では SharePoint / OneDrive の URL も可)、保存、閉じる、情報取得、操作対象指定、テンプレート一覧 | | **スライド** | 10 | 追加、削除(一括)、複製(位置指定・複数)、移動(一括)、コピー(プレゼン間)、一覧、情報取得、ノート、ナビゲーション | | **シェイプ** | 10 | 図形/テキストボックス/画像/線の追加(Z順序指定つき、テキストの下に置くことも可)、一覧、情報取得(位置・塗り・線・テキストフレーム)、更新(単体/複数/スライド全体、絶対値・相対値)、削除、Z順序 | | **テキスト** | 10 | テキスト設定(全体/書式を保ったまま一部/ラン単位)、取得(寸法とはみ出し判定つき)、書式設定(単一スパン/一括)、段落書式、箇条書き、検索置換(グループ内も可)、テキストフレーム、全テキストMarkdown抽出、組版チェック | | **プレースホルダー** | 6 | 一覧、情報取得、テキスト設定 | | **書式設定** | 3 | 塗りつぶし、線、影(図形またはテキストに適用) | | **テーブル** | 13 | テーブル追加、セル取得/設定、一括データ設定、セル結合/分割、行/列の追加/削除、スタイル、レイアウト、罫線 | | **エクスポート** | 4 | PDF、画像、スライドプレビュー、クリップボードコピー | | **スライドショー** | 6 | 開始、停止、次へ、前へ、スライド移動、状態取得 | | **グラフ** | 7 | グラフ追加、データ設定/取得、書式設定、軸書式設定、系列設定、種類変更 | | **アニメーション** | 6 | トランジション、アニメーション追加/一覧/更新/削除/全削除(入口・退出・強調・モーションパス・インタラクティブシーケンス対応) | | **テーマ** | 4 | テーマ適用、テーマカラー取得/設定、ヘッダー/フッター設定 | | **グループ** | 3 | グループ化、グループ解除、グループ項目取得 | | **コネクタ** | 2 | 追加、書式設定 | | **ハイパーリンク** | 3 | 追加、取得、削除 | | **セクション** | 3 | 追加、一覧、管理 | | **プロパティ** | 2 | プレゼンテーションメタデータの設定/取得 | | **メディア** | 3 | ビデオ、オーディオ、メディア設定 | | **SmartArt** | 3 | 追加、編集、レイアウト一覧 | | **編集操作** | 6 | 元に戻す、やり直し(操作対象のプレゼンに対して)、スライド間シェイプ/書式コピー | | **レイアウト** | 7 | 整列、分散配置、スライドサイズ、背景、反転、シェイプ結合 | | **視覚効果** | 3 | グロー、反射(図形またはテキストに適用)、ぼかし | | **コメント** | 3 | 追加、一覧、削除 | | **高度な操作** | 19 | タグ、フォント一括設定/置換、トリミング、画像フォーマット、シェイプエクスポート、表示/非表示、選択、ビュー、アニメーションコピー、URL画像、SVGアイコン、アイコン検索、縦横比ロック、一括書式設定、デフォルト図形スタイル設定 | | **フリーフォーム** | 7 | パス形状の作成、ノード位置の取得/移動、ノードの挿入/削除、編集タイプ変更、セグメントタイプ変更 | | | **156** | | ## 💡 プロンプト例 日本語でそのまま伝えるだけ — コードは不要です。 --- **シンプル** — テーマだけ指定 > *「Flowlyというアプリの紹介スライドを3枚作って。」*
スライドを見る
--- **スタイル指定あり** — テーマ+ビジュアルの方向性 > *「非同期ワークのメリットについて4枚スライドを作って。ダークネイビースタイルで、各メリットにアイコンを入れて。」*
スライドを見る
--- **詳細指定** — テーマ+デザインイメージ+スライド構成 > *「NoteAIというAIメモアプリの5枚ピッチを作って。白背景・ティールアクセント。スライド構成:タイトル・課題・解決策・機能(アイコン付き)・クロージング。」*
スライドを見る
--- **クオリティを上げるデザインキーワード:** | 観点 | 単語やフレーズ例 | 詳細 | |---|---|---| | **アイコン** | `アイコンを入れて` · `各ポイントにアイコン` · `全スライドにアイコン` | Google Material Symbols を自動検索してSVGアイコンを配置 | | **カラースキーム** | `ダークネイビー` · `白背景` · `モノクロ` · `ライトグレー` | 全体のカラーパレットと雰囲気を設定 | | **アクセントカラー** | `ティールアクセント` · `ブルーアクセント` · `ブランドカラーは #2563EB` | 見出しやアイコン、図形に適用する強調色を指定 | | **スタイル・トーン** | `モダンでミニマル` · `ビビッドでインパクト重視` · `クリーンでプロフェッショナル` · `カジュアル` | デザイン全体のテイストを指定 | | **用途・目的** | `ピッチデッキ` · `投資家向けプレゼン` · `ワークショップ資料` · `進捗報告` | 目的に応じたレイアウトとコンテンツ密度に誘導 | | **スライド構成** | `構成:タイトル・課題・解決策・機能・CTA` · `4枚で` | 構成とスライド数を最初に明示 | | **レイアウト** | `カードレイアウト` · `2カラム` · `センタリング` · `全面背景` | 各スライドのコンテンツ配置を指定 | | **テキスト量** | `テキストは最小限` · `1スライド1メッセージ` · `箇条書き` | 情報量とテキストスタイルを制御 | | **背景** | `グラデーション背景` · `ダーク単色背景` · `ソフトな明るい背景` | 背景の処理を全体に指定 | | **強調** | `数字を強調` · `太い見出し` · `各スライドにアクセントバー` | 重要な情報への視線の誘導を指定 | ## 🔍 機能の詳細 ### 🎯 プレゼンテーション操作対象の指定 `ppt_activate_presentation` でセッションレベルの操作対象を設定すると、以降のすべてのツールがそのファイルに対して動作します。PowerPointのウィンドウが切り替わっても影響を受けません。再度呼び出すことで対象を切り替えられます。 ```python ppt_activate_presentation(presentation_name="report.pptx") # 以降のツールはすべて report.pptx を操作 ppt_activate_presentation(presentation_name="demo.pptx") # 切り替え — 以降は demo.pptx を操作 ``` 操作対象はサーバー全体で1つだけです。Claude Desktop のように、1つのサーバーにすべての会話を通すクライアントもあります。複数の会話で別々のファイルを同時に扱うときは、各呼び出しに `presentation` を渡してください。その呼び出しだけに効き、アクティブ化済みの操作対象は変わりません。フルパス、ファイル名、拡張子なしのファイル名のいずれでも指定できます。開いていないファイルを指定するとエラーになり、別のファイルに処理が流れることはありません。 ```python ppt_add_textbox(params={...}, presentation="report.pptx") # 他の会話が何をアクティブ化していても report.pptx に追加される ``` ### 📁 テンプレート対応 個人用のPowerPointテンプレートフォルダを自動検出します(レジストリ、OneDrive、デフォルトパスを順に確認)。`ppt_list_templates` でテンプレートを一覧し、`ppt_create_presentation(template_path=...)` で任意のテンプレートから新規プレゼンテーションを作成できます。 ### 🎨 Google Material Symbolsアイコン `ppt_search_icons(query="...")` で2,500以上の[Google Material Symbols](https://fonts.google.com/icons)アイコンをキーワード検索し、`ppt_add_svg_icon` でSVG画像として挿入: - **3つのスタイル**: outlined、rounded、sharp - **塗りつぶしバリアント**: `filled=True` で指定 - **テーマカラー**: `color="accent1"` でプレゼンのアクセントカラーを自動適用 - **自動フィット**: 指定エリア内でアスペクト比を保持 ### ⚡ リアルタイムナビゲーション 書き込み操作のたびに、PowerPointの画面が自動的に対象スライドに移動します。変更がリアルタイムで目の前に表示されるため、手動でスライドを切り替える必要はありません。 ### ✍️ テキスト制御 - `\n` — 改段落(Enter)。段落ごとに独自の箇条書き・インデントレベルを持つ - `\v` — 改行(Shift+Enter)。同じ段落内に留まり、書式を維持 - `ppt_format_text_range` で文字単位の書式設定 - 自動調整: テキストをシェイプに収める、シェイプをリサイズ、またはオーバーフロー ### 🎨 テーマカラーのプリセット・自動生成 `ppt_set_theme_colors` は3つのモードに対応: - **17種のプリセット** — WCAG AAアクセシブルなパレット。5カテゴリ: Classic(`corporate_blue`, `executive`, `consulting`)、Design Systems(`tailwind`, `chakra`, `open_color`, `radix`)、Nature(`ocean`, `forest`, `sunset`, `sage`)、Modern(`nord_light`, `pastel_deep`, `swiss`)、Vibrant(`vivid`, `rainbow`, `neon_safe`) - **プライマリカラー生成** — ブランドカラー1色(`primary="#2B579A"`)からカラーハーモニー(分割補色 + 類似色)を使って調和のとれた配色を自動生成 - **手動指定** — 個別のカラースロット(`accent1`, `accent2` など)を直接設定 モードは組み合わせ可能:プリセットをベースに特定のスロットだけ上書きできます。すべてのアクセントカラーは白背景に対して3:1以上のコントラスト比を保証。 ### 🔍 組版チェック `ppt_check_typography` はよくある組版の問題を検出し、自動修正も可能: - **ウィドウ行** — 折り返しにより1〜3文字だけの行が発生した状態 - **改行後の短い行** — 手動改行(`\v`)後の短すぎる行 - **自動縮小テキスト** — PowerPointの「テキストに合わせて縮小」で暗黙的に圧縮されたテキスト 自動修正はテキストボックスの拡幅やソフトリターン挿入で対応します。 ## ⚙️ 詳細設定 ### PowerPointのモーダルダイアログへの対応 PowerPointのモーダルダイアログ(SmartArt レイアウト選択、保存ダイアログ、挿入ダイアログなど)が開いているとき、COMの呼び出しは `RPC_E_CALL_REJECTED` を返します。MCPサーバーは**最大15秒(5回 × 3秒)自動的にリトライ**するため、ダイアログが表示されていてもサーバー接続が安定して維持されます。 **自動ESCによるダイアログ閉じ(オプトイン):** デフォルトでは、ユーザーが手動でダイアログを閉じるのを待ちます。最初のリトライ時にESCキーを自動送信してダイアログを閉じさせるには、`PPT_AUTO_DISMISS_DIALOG=true` を設定してください: ```json { "mcpServers": { "powerpoint": { "command": "uvx", "args": ["ppt-mcp"], "env": { "PPT_AUTO_DISMISS_DIALOG": "true" } } } } ``` ESCは変更を確定せずにキャンセルするため、意図しない操作は発生しません。人間が操作しない自動化ワークフローで特に有用です。 ## 🍎 macOS 対応 **macOS で断るツールは 12 です。残りは動きます。**その 12 は [MACOS_PORT.md](MACOS_PORT.md) の 6.1 に名前で並べてあり、 その一覧が古びないようにテストで見張っています。 ツールも引数も返り値も Windows と同じです。違うのは PowerPoint for Mac の スクリプト辞書が届く範囲だけで、届かないところではツールがそう答えます。 黙って何もしなかったことにはしません。 macOS でできないこと。 - **SmartArt。** 辞書にクラスもコマンドもないので、スクリプトからは作ることも 編集することもできません。すでに置いてあるものは、ただの図形として 動かしたり読んだり消したりできます - **フリーフォームの頂点の編集タイプ。** 角、スムーズ、対称という区別は スクリプトから届く場所のどこにも記録されていません。代わりにハンドルの 頂点を動かしてください - **アニメーションを1つだけ削除。** スライドごと消すことはできます - **タグ、`ppt_select_shapes`、`ppt_set_table_style`、`ppt_execute_mso`。** どれも辞書に届く手段がありません 細かい違い。 - **ツールは1つずつ順番に呼んでください。**同じ返信で並べて呼ばないでください。 PowerPoint に届くのは一度に1つだけなので、残りは後ろに並んで待ちます。 出てくる順番は届いた順のままです。待たされすぎた呼び出しは取り下げられ、 何も変えないままそう答えます - 対応するものがない引数を渡すと、その引数を名指しして断ります。 たとえばハイパーリンクのスクリーンチップです。外して呼び直せば通ります - **動画と音声はファイルを埋め込みます。リンクはできません。**再生の設定は 8つのうち繰り返しと再生していないときに隠すの2つだけです。隠す方は アニメーションのあるスライドでは断ります。書き込むとそのスライドの アニメーションを作り替えてしまうからです - PowerPoint はサンドボックスの中にいて任意のフォルダーに書けないので、 書き出しは PowerPoint 自身の容器を経由して取り出します - スライド画像は PNG 書き出しではなく PDF から描画しています。 Windows の経路より鮮明です - 自動化の許可はサーバーを起動したアプリに紐づきます。別のターミナルや エディターから起動すると、もう一度許可を求められます - こまめに保存してください。損はありませんし、スクリプトの後ろで サンドボックスの確認が出たときに、PowerPoint が開いている書類を全部閉じて そのまま終了した例があります ([#191](https://github.com/ykuwai/ppt-mcp/issues/191)) - **グラフとフリーフォームとグループ化はクリップボード経由です。**操作の間だけ クリップボードを借りて、終わったら元に戻します。辞書にこの3つを表す言葉が ないので、こうして届かせています - **すでにあるグラフやパスを直すと、図形が作り直されます。**グラフのデータ、 種類、タイトル、凡例、軸、系列のツールと、頂点のツールは、図形をコピーして 書き換え、貼り直してから元を消します。名前、位置、重なり順は保たれますが、 その図形についていたアニメーションは残らず、いくつ消えたかを返り値で 伝えます。グラフの描画サイズに依存する引数 (`chart_style`、凡例と タイトルの座標、8方向の凡例位置、`tick_label_font_size`) は引数名を挙げて 断ります - アイコンは挿入前に `sips` で PNG にしています。PowerPoint for Mac は SVG を 読めないからです。macOS 13 以降が必要で、それより古いと空の四角ではなく 理由を書いた拒否が返ります ## 📄 ライセンス MIT ## 🙏 クレジット - [FastMCP](https://github.com/jlowin/fastmcp) — Python MCPサーバーフレームワーク - [pywin32](https://github.com/mhammond/pywin32) — Windows COM自動化 - [appscript](https://github.com/hhas/appscript) — macOS Apple Event ブリッジ - [Model Context Protocol](https://modelcontextprotocol.io/) — by Anthropic