LabWired
회로 설계·펌웨어 실행·변형 비교·Playground 결과 확인, 오픈소스, 무료 체험
전 세계 최고 수준의 PowerPoint MCP 서버, Windows·macOS에서 실시간 제어, AI 에이전트를 위한 156가지 도구
The world's best PowerPoint MCP server. Real-time control of a live PowerPoint on Windows and macOS, 156 tools for AI agents
개발 도구Python · Visual Basic 6.0GitHub @ykuwai직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Real-time PowerPoint control on Windows and macOS — an MCP server with 156 tools for AI agents and developers.
An MCP (Model Context Protocol) server that gives AI agents full control over a live Microsoft PowerPoint instance, over COM on Windows and Apple Events on macOS. Unlike file-based libraries like python-pptx, this server interacts directly with a running PowerPoint application.
An agent building a deck in a live PowerPoint window (15x speed):README 전문 보기 ↗An MCP (Model Context Protocol) server that gives AI agents full control over a live Microsoft PowerPoint instance, over COM on Windows and Apple Events on macOS. Unlike file-based libraries like python-pptx, this server interacts directly with a running PowerPoint application.
An agent building a deck in a live PowerPoint window (15x speed):
https://github.com/user-attachments/assets/178b9b5b-624d-4de0-a1dd-619dc13d4bd7
ppt_activate_presentation locks all tools to a specific file, preventing accidental edits to the wrong presentationaccent1, accent2, etc. wherever a fill, line, shadow, glow or text color is taken, instead of hardcoded RGB values; the shapes follow the theme when it changesOn macOS the server drives PowerPoint over Apple Events instead of COM. The first tool call raises the system's automation prompt, and PowerPoint has to be allowed there once. Pictures, icons, templates, themes, previews and exports pass through PowerPoint's own folder, which macOS 14 and later keeps other apps out of, so the application that launches the server (Terminal, an editor, Claude) needs Full Disk Access for those tools. Run from a terminal, macOS may refuse without asking; the tools then say what to grant. Shapes, text, tables and charts work regardless. See macOS support for what differs.
Standard config — works in Claude Desktop, Cursor, .mcp.json, and most other MCP clients:
{
"mcpServers": {
"powerpoint": {
"command": "uvx",
"args": ["ppt-mcp"]
}
}
}
User-scoped (available in all projects)
claude mcp add --scope user powerpoint uvx ppt-mcp
Project-scoped (stored in .mcp.json, shared with your team)
claude mcp add --scope project powerpoint uvx ppt-mcp
Or add manually to ~/.cursor/mcp.json using the standard config above.
Edit %APPDATA%\Claude\claude_desktop_config.json using the standard config above.
Edit ~/.codex/config.toml:
[mcp_servers.ppt-mcp]
command = "uvx"
args = ["ppt-mcp"]
Or use the standard JSON config above in .codex/config.json.
code --add-mcp '{"name":"powerpoint","command":"uvx","args":["ppt-mcp"]}'
git clone https://github.com/ykuwai/ppt-mcp.git
cd ppt-mcp
uv sync
{
"mcpServers": {
"powerpoint": {
"command": "uv",
"args": [
"--directory",
"C:\\path\\to\\ppt-mcp",
"run",
"mcp",
"run",
"src/server.py"
]
}
}
}
The full list of tools, by category, is in TOOLS.md.
Just describe what you want in plain language — no code required.
Simple — topic only
"Create a 3-slide intro deck for a productivity app called Flowly."
With style direction — topic + visual style
"Make a 4-slide presentation on the benefits of async work. Dark navy style, add icons for each benefit."
Detailed — topic + design intent + slide structure
"Build a 5-slide pitch for an AI note-taking app called NoteAI. White background, teal accent. Slides: title, problem, solution, features with icons, closing."
Design keywords that elevate results:
| Aspect | Keywords / Phrases | What it does |
|---|---|---|
| Icons | add icons · icon for each point · use icons throughout | Searches Google Material Symbols and places crisp SVG icons automatically |
| Color scheme | dark navy · white background · monochrome · light gray | Sets the overall color palette and mood |
| Accent color | teal accent · blue accent · brand color #2563EB | Applies a specific highlight color to headings, icons, and shapes |
| Style tone | modern minimal · bold and vibrant · clean and professional · playful | Signals the overall visual personality |
| Deck type | pitch deck · investor presentation · workshop slides · status report | Guides layout and content density toward the intended purpose |
| Slide structure | Slides: title, problem, solution, features, CTA · 4 slides | Defines the narrative arc and slide count up front |
| Layout | card layout · two-column · centered · full-bleed background | Shapes how content is arranged on each slide |
| Text density | minimal text · one message per slide · bullet points | Controls how much text appears and how it's formatted |
| Backgrounds | gradient background · solid dark background · soft light background | Specifies the background treatment across slides |
| Emphasis | highlight key numbers · bold headings · accent bar on each slide | Draws attention to the most important information |
ppt_activate_presentation sets a session-level target so every subsequent tool call operates on that specific file — regardless of which window is active in PowerPoint. Switch targets anytime by calling it again.
ppt_activate_presentation(presentation_name="report.pptx")
# All tools now operate on report.pptx
ppt_activate_presentation(presentation_name="demo.pptx")
# Switched — all tools now operate on demo.pptx
The activated presentation is one value for the whole server, and a client such as Claude Desktop routes every conversation through one server. When several conversations work on different files at once, pass presentation on each call. It applies to that call only, leaves the activated presentation alone, and accepts a full path, a file name, or a file name without extension. A file that is not open is an error, never a fallback to another one.
ppt_add_textbox(params={...}, presentation="report.pptx")
# Lands in report.pptx whatever another conversation has activated
A presentation opened from SharePoint or OneDrive can be edited by other people while the server works on it. Without AutoSave, PowerPoint takes in what they have saved only when the file is saved, and shows "Updates available" until then; the server would read and write the older state. The server handles that for such a file:
coauthoring: pending_updates (changes wait; ppt_save_presentation takes them in), merged_updates (they were just merged), conflict. ppt_open_presentation, ppt_activate_presentation and ppt_get_presentation_info always report it, with coauthor_count; ppt_list_presentations gives pending_updates per file.utils.coauthoring.set_conflict_resolver(fn) registers a function that gets the Presentation on the COM thread and returns True once the dialog is answered; the result then lists in overwritten each slide that now differs from this copy's version, with the text it had here.Auto-detects your personal PowerPoint templates folder (registry, OneDrive, or default paths). Use ppt_list_templates to discover available templates, then ppt_create_presentation(template_path=...) to create a new presentation from any template.
Search 2,500+ Google Material Symbols icons with ppt_search_icons(query="...") and insert them as SVG with ppt_add_svg_icon:
filled=Truecolor="accent1" uses the presentation's accent colorEvery write operation automatically navigates PowerPoint to the target slide. You see changes happening in real-time — no need to manually switch slides.
\n — Paragraph break (Enter). Each paragraph gets its own bullet/indent level.\v — Line break (Shift+Enter). Stays in the same paragraph, preserving formatting.ppt_format_text_rangeppt_set_theme_colors supports three modes:
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)primary="#2B579A") to auto-generate a full harmonious palette using color harmony (split-complementary + analogous)accent1, accent2, etc.)Modes can be combined: use a preset as a base and override specific slots. All accents are guaranteed 3:1+ contrast on white.
ppt_check_typography detects and optionally auto-fixes common typography issues:
\v)Auto-fix strategies include widening text boxes and inserting soft returns.
ppt_check_layout measures a slide, or the whole deck, and reports what is wrong as numbers rather than as a picture, so it works whether or not the model can read images:
ppt_crop_picture crop_fitppt_update_shape alt_text sets it on Windows; PowerPoint for Mac does not let a tool set it, so there it is set by handShapes inside groups and SmartArt graphics are checked for what their text says and how it is set: overflow, contrast, sample text, fonts, direction and size.
A slide is judged as the slide show draws it. Lines a build-up shows one at a time in one place do not overlap, a shape a motion path moves is judged where it goes, a sound's icon dragged off the slide is hidden on purpose, and a shape waiting off a slide next to a Morph transition is left there. A finding on a hidden slide says that it is hidden.
Each issue names the shapes and says how to fix it, with the tool call and its values. A fix keeps the slide together rather than only clearing the issue: a card grows with its padding and the rest of its row, and a shape brought back onto the slide keeps the slide's margin. The tools that add, copy, move, resize, align, distribute or retext a shape, or fill a placeholder, also check the shape they touched and report any problem in their own result, under layout_issues, so it is caught by the call that caused it. A new slide background, or a new fill under text, reports the text it left hard to read, and a change to the whole deck, its theme, theme colours, fonts or slide size, reports what it broke that was not broken before.
Each of those checks reads the slide back, which adds a moment to every write, more on the Mac. To leave the checking to ppt_check_layout alone, set PPT_LAYOUT_CHECKS=off in the server's env; the server's instructions then tell the model to run it after each few changes. The accepted values are on (the default) and off; anything else is ignored with a warning and the checks stay on. A change to the whole deck (theme, theme colours, font, default fonts, slide size) reads every slide before and after. On a deck of more than 300 shapes it reads neither, since that would take longer than the change, and says so under layout_check_skipped, leaving the deck to ppt_check_layout. Paragraph formatting, bullets, picture crops and formats, grouping, SmartArt, chart data, lines, deleting table rows and columns, splitting cells and copying slides are checked the same way. A slide copied into another open deck is not: the check reads the deck the server is working on.
On a deck made from a template, the template is part of the check. The graphics its slide master and layouts draw are read, so a chart sized over the logo or a footnote on the confidentiality line is reported, and what the template designed is taken as meant: a placeholder still in the theme's colours, or a caption layout's own smaller title, is not held to the rest, and in a deck on two designs each design's titles are compared only with each other. Theme colours set with ppt_set_theme_colors are the caller's, so that call judges the placeholders in them too, and so does every later check once the theme's own text colour no longer reads on its background. PowerPoint for Mac exposes the master's graphics but not a layout's own, nor what is inside a group, so there the layout's graphics, its title's place, the theme's fonts and the text inside groups are read from the deck's saved file, while it holds what is on screen. On a deck not yet saved, or changed since, a layout's design is allowed for through its placeholders.
When PowerPoint has a modal dialog open (e.g., SmartArt layout picker, Save dialog, Insert dialog), COM calls return RPC_E_CALL_REJECTED. The MCP server automatically retries for up to 15 seconds (5 retries × 3 s), so the server stays connected and responsive even when a dialog is blocking PowerPoint.
Auto-dismiss (opt-in): By default, the server waits for you to close the dialog manually. To have the server automatically send ESC on the first retry — dismissing the dialog without user interaction — set PPT_AUTO_DISMISS_DIALOG=true:
{
"mcpServers": {
"powerpoint": {
"command": "uvx",
"args": ["ppt-mcp"],
"env": {
"PPT_AUTO_DISMISS_DIALOG": "true"
}
}
}
}
ESC cancels without committing, so there are no destructive side effects. This is particularly useful in automated workflows where no human is present to close dialogs.
If no PowerPoint is running when a tool needs one (ppt_create_presentation, ppt_open_presentation, ppt_connect), the server starts it. On macOS it starts in the background and does not take the front from the app you are working in.
When a close leaves no presentation open in a PowerPoint the server started, ppt_close_presentation quits PowerPoint too and says so (powerpoint_quit). A PowerPoint you started yourself is never quit, and neither is one that still has a presentation open (on Windows, or a file open in Protected View). Pass keep_powerpoint_open=true to keep it running, for example to open another presentation straight away. Until a tool starts PowerPoint again, tools that need it answer that PowerPoint is not running, where they would otherwise have reported an empty list. On Windows, a file open in Protected View is listed by ppt_list_presentations under protected_view, and ppt_close_presentation closes it by its name, without saving.
Each write moves the deck's window to the slide it works on, so you can see where the model is. To work in the deck yourself at the same time, without the window jumping to another slide, set PPT_FOLLOW_EDITS=off in the server's env. The edits land the same way; only the window stays where you left it. ppt_goto_slide still moves it when asked. The accepted values are on (the default) and off; anything else is ignored with a warning. While you are typing in a text box PowerPoint may hold the model's call for a moment, and undo (Ctrl+Z) is shared, so it can take back the model's last change.
"env": { "PPT_FOLLOW_EDITS": "off" }
ppt_search_icons reads its icon list from fonts.google.com, and ppt_add_svg_icon downloads icons from cdn.jsdelivr.net. Every download, pictures by URL included, gives up after 15 seconds and says which host it could not reach. Three settings change that:
| Setting | Default | What it does |
|---|---|---|
PPT_ICON_BASE_URL | https://cdn.jsdelivr.net/npm/@material-symbols/[email protected] | Where icons come from. Any address with the package's layout (<base>/outlined/home.svg) works: a mirror such as https://unpkg.com/@material-symbols/[email protected], or a local copy of the package as file:///path/to/svg-400. |
PPT_ICON_METADATA_URL | https://fonts.google.com/metadata/icons | Where the icon list comes from. Save that page once and point this at the copy, as file:///path/to/icons.json. |
PPT_DOWNLOAD_TIMEOUT | 15 | Seconds to wait for a server to answer. A value that is not a positive number is ignored (15 is used). |
{
"mcpServers": {
"powerpoint": {
"command": "uvx",
"args": ["ppt-mcp"],
"env": {
"PPT_ICON_BASE_URL": "https://unpkg.com/@material-symbols/[email protected]"
}
}
}
}
A client sends the description of every tool it lists with every request, and this server's tools come to about 112k tokens, a large part of a 128k or 200k window before any work. By default the server lists three tools instead, about 700 tokens, and the model reaches the rest through them:
| Tool | What it does |
|---|---|
ppt_describe | With no names, the list of all the tools, one line each. With names, their full description and arguments. |
ppt_run | Runs one tool: {"tool": "ppt_add_textbox", "params": {...}}. |
ppt_run_steps | Runs several in order, in one call. A step can use what an earlier one answered: "$prev.shape_name" is the previous step's shape_name, "$2.shape_name" the second step's. The first step that fails ends the run and says why. |
The tools themselves are the same, with the same arguments, checks and answers, and presentation is passed the same way. The model asks ppt_describe before using a tool for the first time, which costs one call. Building the same 12-slide deck through Claude Code, the context peaked at 136k tokens in catalog mode against 206k with every tool listed, and the run cost a third less.
What catalog mode gives up is per-tool control in the client: approving or blocking a tool by its name, and its read-only hint, apply to the three tools above rather than to each one. A client that relies on that sets PPT_TOOL_MODE=full in the server's env, and every tool is listed by its own name, as below; PPT_TOOL_MODE=catalog is the default. A value other than catalog or full is ignored with a warning, and catalog mode is used.
{
"mcpServers": {
"powerpoint": {
"command": "uvx",
"args": ["ppt-mcp"],
"env": { "PPT_TOOL_MODE": "full" }
}
}
}
With the VBA add-in, on by default, 3 tools refuse on macOS; without it, 10 do. The rest work. The 10 are listed by name in MACOS_PORT.md section 6.1, and a test keeps that list honest.
The same tools, the same arguments, the same answers. What differs is what PowerPoint for Mac's scripting dictionary can reach, and where it cannot reach something the tool says so rather than doing something unexpected.
PowerPoint for Mac's VBA reaches further. The
server loads a small add-in, ppt-mcp-bridge, into PowerPoint and runs the
Windows code through it for what the scripting dictionary has no words for:
tags, ppt_select_shapes, ppt_set_table_style, removing and copying one
animation, a freeform node's editing type, the chart formatting, axis, series, type and
data tools (the data
through the chart's Excel workbook, which opens in Excel for a moment, as on
Windows), the freeform node
tools and grouping, text inside a group, a template's layouts by name,
duplicating and copying slides, editing a SmartArt (its text, nodes, colours
and style), and the arguments the Mac otherwise refuses (a screen tip,
a table row or column at a position, a click trigger on another shape,
reflection sizes, glow, shadow and reflection on text, shrinking text to fit,
volume, mute, trimming and fades, a chart style and the legend and title placement).
Those edit the shape in place, so it keeps its animations, and the clipboard is
not touched. The add-in only passes those calls on; its source is in
src/backend/vba. PowerPoint loads it without a prompt and keeps it until PowerPoint quits;
a copy of the file stays in PowerPoint's own folder. While it is loaded, other
programs allowed to control PowerPoint can call it too, but only within
PowerPoint's object model, and it refuses to run macros, quit or reach add-ins. Where it cannot be loaded,
where macros are turned off by policy for instance, the tools work as described
below. macOS may ask whether the app that runs the server may reach data
from other apps; allow it, as the add-in answers through PowerPoint's folder.
Until it is answered, or if it is refused, the tools work as described below
after a two-second wait. It is on by
default; PPT_MAC_VBA=off in the server's env turns it off. A call the
add-in would have taken then says so, in its hint or warnings, as it does
when the add-in cannot be loaded.
Not available on macOS:
ppt_execute_mso, and without the add-in also a freeform node's
editing type (move the node's handles instead), tags,
ppt_select_shapes, ppt_set_table_style and removing one animation
(clearing a slide's animations works). Nothing in the dictionary reaches them.Smaller differences:
ppt_add_slide for one
by name. PowerPoint for Mac names no layouts to a script, so the slide is
pasted in on its layout, which takes about a second. With the add-in the
layout is found in the open deck, saved or not.ppt_activate_presentation brings it to the front.chart_style, legend and
title coordinates, the 8-direction legend presets) are refused by name.Pull requests are welcome. Base them on develop, one topic each, with tests; CONTRIBUTING.md has the rest.
MIT
ppt_set_paragraph_format direction='rtl'"Group 4/TextBox 3"), with ppt_set_text (the whole text, or a span
inside one line) and ppt_format_text. With the add-in the member is edited
in place. Without it the group is copied, the member rewritten and the group
pasted back: the members keep their names, and the group loses its
animations, as above.sips before they are inserted, because
PowerPoint for Mac cannot read an SVG. That needs macOS 13 or newer; older
systems get a refusal naming the reason rather than a blank box.