dial-pptx-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOG_LEVEL | No | DEBUG, INFO, WARNING, ERROR or CRITICAL | INFO |
| DIAL_API_KEY | No | Server's own DIAL API key used as fallback or shared-bucket identity | |
| PPT_MCP_HOST | No | Bind address; set 0.0.0.0 in containers | 127.0.0.1 |
| PPT_MCP_PORT | No | Listen port for http/sse | 8000 |
| SOFFICE_PATH | No | LibreOffice binary used to render slides | soffice |
| DIAL_CORE_URL | No | Base URL of DIAL Core, e.g. https://dial.example.com. Required for DIAL export/upload tools | |
| DIAL_AUTH_MODE | No | auto: use incoming caller credentials first, fall back to DIAL_API_KEY; caller: incoming only; server: always DIAL_API_KEY | auto |
| DIAL_PUBLIC_URL | No | Extra host(s) DIAL file links may carry besides DIAL_CORE_URL (comma-separated URLs or hostnames) | |
| SVG_ICON_MAX_KB | No | Largest SVG source render_svg_icon will rasterize | 64 |
| VISION_LLM_MODEL | No | Vision model name (direct endpoint or DIAL deployment name); must accept image input. Required for visual QA | |
| DIAL_IMAGE_MAX_MB | No | Largest image add_image_from_dial_url will download and embed | 20 |
| PPT_MCP_MAX_ICONS | No | Rendered icons held in memory for add_icon_to_slide, LRU-evicted | 100 |
| PPT_MCP_TRANSPORT | No | Transport mode: http, sse, or stdio | stdio |
| PPT_TEMPLATE_PATH | No | Extra local directories searched by local-path template tools (colon-separated) | |
| VISUAL_QA_ENFORCE | No | false unregisters the visual QA tools entirely | true |
| DIAL_UPLOAD_FOLDER | No | Folder inside the bucket for exported decks | pptx-mcp |
| VISION_LLM_API_KEY | No | Key for the direct vision endpoint (sent as api-key and Authorization: Bearer) | |
| VISUAL_QA_ON_ERROR | No | Export gate only: allow exports when inspection itself cannot run | block |
| VISION_LLM_ENDPOINT | No | OpenAI Responses-API endpoint for direct vision provider. When unset, model is called through DIAL Core | |
| VISION_LLM_PROVIDER | No | Force vision backend: direct or dial (default: direct when VISION_LLM_ENDPOINT is set, else dial) | auto |
| PPT_MCP_ALLOWED_HOSTS | No | Comma-separated Host-header allowlist for http/sse. Only listed hosts plus localhost are accepted; set * to disable Host checking | dial-pptx-mcp.dial.svc.cluster.local |
| VISION_LLM_MAX_SLIDES | No | Cap on slides sent per whole-deck inspection (explicit slides list is never capped) | 15 |
| VISUAL_QA_EXPORT_GATE | No | true also runs a whole-deck inspect-repair loop inside export/save and refuses unverified decks | false |
| VISION_LLM_API_VERSION | No | api-version query parameter added to the vision call when the endpoint URL doesn't already carry one | 2025-04-01-preview |
| VISUAL_QA_ON_UNRESOLVED | No | Export gate only: report fails the export with the issue list, export_as_is ships the deck | report |
| VISUAL_QA_MAX_ITERATIONS | No | Inspect/repair rounds per visual_repair_slides call | 10 |
| PPT_MCP_STATE_TTL_SECONDS | No | Idle time before an in-memory presentation expires | 3600 |
| PPT_MCP_STATE_MAX_PRESENTATIONS | No | Max concurrently held presentations (LRU eviction) | 50 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_presentationA | Create a new PowerPoint presentation. Returns a presentation_id that must be passed to all subsequent tool calls for this deck. |
| create_presentation_from_templateA | Create a new PowerPoint presentation from a template file. Returns a presentation_id that must be passed to all subsequent tool calls. |
| open_presentationA | Open an existing PowerPoint presentation from a file. Returns a presentation_id that must be passed to all subsequent tool calls. |
| save_presentationC | Save a presentation to a file. |
| get_presentation_infoC | Get information about a presentation. |
| get_template_file_infoB | Get information about a template file including layouts and properties. |
| create_presentation_from_template_contentA | Create a new presentation from an uploaded .pptx template file. A PowerPoint 97-2003 (.ppt) file is accepted too and converted to .pptx on the way in, where the server has LibreOffice. template_content: the .pptx/.potx/.ppt template file content, as a data: URI or a base64-encoded string (in DIAL Quick Apps, pass the template file as file:data::files/{bucket}/{path} and it is resolved automatically). The template's theme, layouts, masters and branding are preserved. Returns a presentation_id that must be passed to all subsequent tool calls for this deck. |
| get_dial_storage_infoA | Report which DIAL file storage this server can actually read and write on this request: the identity in use, the bucket it owns, and its appdata path. Use it when a file URL is refused: DIAL storage is per-user, so a file whose URL names a different bucket than the one reported here cannot be downloaded, however valid the URL looks. |
| export_presentationA | Export the presentation to DIAL file storage and return its file URL. Use this (not save_presentation) to deliver the finished deck to the user. format: "pptx" (default) for the editable deck; "pdf" for a read-only copy; "both" to deliver the pair, which is what a user who asked to "share" or "send" a deck usually wants. PDF is produced by rendering the deck through LibreOffice, so it needs the renderer and reflects that renderer's fonts — see get_design_guidance("type"). Export does NOT run visual QA for you: inspect the deck with visual_inspect_slides / visual_repair_slides while you build it, or at least once before exporting. The response carries "visual_qa": "passed" | "unverified" | "unavailable" so you can tell whether the deck was ever checked. ALWAYS include the returned file_url in your final answer as an attachment so the user can download the presentation. |
| set_core_propertiesC | Set core document properties. |
| add_slideC | Add a new slide to the presentation with optional background styling. |
| get_slide_infoC | Get information about a specific slide. |
| extract_slide_textA | Extract all text content from a specific slide, speaker notes included. |
| extract_presentation_textA | Extract all text content from all slides in the presentation. Use this as the content-QA read on a finished deck: check for missing or duplicated sections, typos, wrong order, and — on a deck built from a template — placeholder text the template shipped with that was never replaced ("Lorem ipsum", "Click to add title", "XXX", "[insert ...]"). Speaker notes come back in each slide's "speaker_notes" but are kept out of "all_text_combined", which holds only what the audience sees. |
| populate_placeholderC | Populate a placeholder with text. |
| add_bullet_pointsC | Add bullet points to a placeholder. |
| manage_textC | Unified text management tool for adding, formatting, validating text, and formatting multiple text runs. |
| manage_imageC | Unified image management tool for adding and enhancing images. |
| add_tableC | Add a table to a slide with enhanced formatting options. |
| format_table_cellC | Format a specific table cell. |
| add_shapeC | Add an auto shape to a slide with enhanced options. |
| add_chartA | Add a chart to a slide with comprehensive formatting options. x_axis_title labels the CATEGORY axis and y_axis_title labels the VALUE axis, whatever the chart's orientation — the names are not screen directions. On column, line and area charts the category axis is the horizontal one, so x/y read as expected. On a BAR chart the bars run sideways: the category axis is VERTICAL and the value axis HORIZONTAL, so x_axis_title appears on the vertical axis. Naming a bar chart's axes by where they look on screen is the usual way these two end up swapped. A 'scatter' chart is the exception to both: it has no category axis, so pass its x values (as numbers) in categories and the matching y values in series_values. Use 'line_markers' when the horizontal axis is really a list of labels. |
| apply_professional_designC | Unified professional design tool for themes, slides, and visual enhancements. This applies professional styling and themes rather than structural layout changes. |
| apply_picture_effectsC | Apply multiple picture effects in combination. |
| manage_fontsC | Unified font management tool for analysis, optimization, and recommendations. |
| list_slide_templatesA | List all available slide layout templates. |
| apply_slide_templateA | Apply a structured layout template to an existing slide. This modifies slide layout and content structure using predefined templates. Args: slide_index: Index of the slide to apply template to template_id: ID of the template to apply (e.g., 'title_slide', 'text_with_image') color_scheme: Color scheme to use ('modern_blue', 'corporate_gray', 'elegant_green', 'warm_red') content_mapping: Dictionary mapping element roles to custom content image_paths: Dictionary mapping image element roles to file paths presentation_id: Presentation ID (uses current if None) |
| create_slide_from_templateB | Create a new slide using a layout template. Args: template_id: ID of the template to use (e.g., 'title_slide', 'text_with_image') color_scheme: Color scheme to use ('modern_blue', 'corporate_gray', 'elegant_green', 'warm_red') content_mapping: Dictionary mapping element roles to custom content image_paths: Dictionary mapping image element roles to file paths layout_index: PowerPoint layout index to use as base (default: 1) presentation_id: Presentation ID (uses current if None) |
| create_presentation_from_templatesA | Create a complete presentation from a sequence of templates. Args: template_sequence: List of template configurations, each containing: - template_id: Template to use - content: Content mapping for the template - images: Image path mapping for the template color_scheme: Color scheme to apply to all slides presentation_title: Optional title for the presentation presentation_id: Presentation ID (uses current if None) Example template_sequence: [ { "template_id": "title_slide", "content": { "title": "My Presentation", "subtitle": "Annual Report 2024", "author": "John Doe" } }, { "template_id": "text_with_image", "content": { "title": "Key Results", "content": "• Achievement 1\n• Achievement 2" }, "images": { "supporting": "/path/to/image.jpg" } } ] |
| get_template_infoB | Get detailed information about a specific template. Args: template_id: ID of the template to get information about |
| auto_generate_presentationB | Automatically generate a presentation based on topic and preferences. Args: topic: Main topic/theme for the presentation slide_count: Number of slides to generate (3-20) presentation_type: Type of presentation ('business', 'academic', 'creative') color_scheme: Color scheme to use include_charts: Whether to include chart slides include_images: Whether to include image placeholders presentation_id: Presentation ID (uses current if None) |
| optimize_slide_textA | Optimize text elements on a slide for better readability and fit. Args: slide_index: Index of the slide to optimize auto_resize: Whether to automatically resize fonts to fit containers auto_wrap: Whether to apply intelligent text wrapping optimize_spacing: Whether to optimize line spacing min_font_size: Minimum allowed font size max_font_size: Maximum allowed font size presentation_id: Presentation ID (uses current if None) |
| manage_hyperlinksA | Manage hyperlinks in text shapes and runs. Args: operation: Operation type ("add", "remove", "list", "update") slide_index: Index of the slide (0-based) shape_index: Index of the shape on the slide (0-based) text: Text to make into hyperlink (for "add" operation) url: URL for the hyperlink run_index: Index of text run within the shape (0-based) presentation_id: Optional presentation ID (uses current if not provided) Returns: Dictionary with operation results |
| update_chart_dataA | Replace existing chart data with new categories and series. Args: slide_index: Index of the slide (0-based) shape_index: Index of the chart shape (0-based) categories: List of category names series_data: List of dictionaries with 'name' and 'values' keys presentation_id: Optional presentation ID (uses current if not provided) Returns: Dictionary with operation results |
| add_combo_chartA | Add a chart whose series are not all the same type, and may use a second value axis. This is what add_chart cannot do. Reach for it when:
series: one entry per series, plotted in the order given: {"name": "Revenue", "values": [10, 12, 15], "type": "column", "secondary_axis": false, "color": [31, 73, 125], "data_labels": true, "label_position": "outside_end", "trendline": "linear"} "type" is required — column, stacked_column, bar, stacked_bar, line, line_markers, area, stacked_area. Pie and scatter cannot share a plot area with other types; use add_chart for those. "color" is [r, g, b]; omit to take the template's own chart palette, which is usually the right choice. "label_position" on a stacked series must be "center", "inside_end" or "inside_base" — a stacked segment has no outside. "trendline" is linear, movingAvg, exp, log, poly or power. secondary_axis_title labels the right-hand axis; y_axis_title labels the left one. x_axis_title labels the category axis (see add_chart on why that is not the same as "the horizontal one"). The result is a real, editable PowerPoint chart, not a picture. |
| format_chart_seriesA | Restyle one series of an existing chart. Use it to pin a series to a brand colour, to label just the series that carries the point rather than all of them, or to add a trendline. series_index is 0-based across the whole chart, in the order the series were added. label_position: center, inside_end, inside_base, outside_end (bars and columns), or above / below / left / right (line charts). A stacked series rejects outside_end. number_format: an Excel format string, e.g. "0.0%" or "#,##0". trendline: linear, movingAvg, exp, log, poly or power; trendline_period is the window for movingAvg or the order for poly. |
| add_connectorA | Add connector lines/arrows between points on a slide. Args:
slide_index: Index of the slide (0-based)
connector_type: Type of connector ("straight", "elbow", "curved")
start_x: Starting X coordinate in inches
start_y: Starting Y coordinate in inches
end_x: Ending X coordinate in inches Returns: Dictionary with operation results |
| manage_slide_mastersB | Access and manage slide master properties and layouts. Args: operation: Operation type ("list", "get_layouts", "get_info") master_index: Index of the slide master (0-based) layout_index: Index of specific layout within master (0-based) presentation_id: Optional presentation ID (uses current if not provided) Returns: Dictionary with slide master information |
| manage_slide_transitionsC | Manage slide transitions and timing. Args: slide_index: Index of the slide (0-based) operation: Operation type ("set", "remove", "get") transition_type: Type of transition (basic support) duration: Duration of transition in seconds presentation_id: Optional presentation ID (uses current if not provided) Returns: Dictionary with transition information |
| add_image_from_dial_urlA | Place an image that already lives in DIAL file storage onto a slide. Use this for generated imagery: call your image model, save the result to DIAL files, then pass the file URL here. The server downloads the bytes itself, so nothing large passes through your context — prefer this over manage_image(source_type="base64") for anything bigger than a small icon. image_url: a DIAL file reference — the "files/{bucket}/{path}" URL an upload returns, or the full https URL of that file on this DIAL installation (the ".../api/files/{bucket}/{path}" link an image deployment hands back works as-is). Arbitrary web URLs are NOT downloaded: to use a picture from the web, fetch it yourself and store it in DIAL file storage first. slide_index: 0-based, like the other content tools (visual QA slide numbers are 1-based; slide_index 0 is slide 1). left, top, width, height: inches. Give width and height to define the box the picture should occupy — for a half-and-half slide on a 13.33in deck, text on the left and left=6.9, top=1.2, width=5.6, height=4.5 for the image. Omit both to keep the image's natural size (clamped to the slide). fit: how the picture relates to that box. "contain" (default) largest undistorted size that fits, centred in the box — safe for photos and illustrations; "cover" fills the box exactly, cropping the overflowing edges; "stretch" forces the exact box and will distort the image. Returns the shape index and the geometry actually applied ("placed": left/top/width/height in inches), which may be smaller than the box you asked for under "contain". |
| delete_slideA | Remove a slide from the presentation. Use this to drop template slides whose content you don't need — a template's unused sections, or the fourth column of a three-item layout. Deleting is preferable to blanking a slide out: an emptied slide still shows the template's decoration and reads as a mistake. slide_index: 0-based. Every later slide shifts down by one, so when removing several, delete from the highest index downwards or re-read get_presentation_info between calls. |
| move_slideA | Move a slide to a different position in the deck. slide_index and new_index are both 0-based, and new_index is the position the slide ends up at once it has been lifted out — moving slide 0 to index 3 in a five-slide deck leaves it fourth. |
| duplicate_slideA | Copy an existing slide, keeping all of its content and formatting. This is the way to reuse a corporate template's designed slides: duplicate the slide whose layout suits your next section, then edit the copy's text with manage_text / populate_placeholder. add_slide builds a bare slide from a layout and gets you none of the template's artwork, so prefer duplicating when the template already contains a slide that looks right. slide_index: 0-based index of the slide to copy. insert_after: 0-based index the copy is placed after; omit to append the copy (or copies) to the end of the deck. count: how many copies to make, for a section that repeats — the copies land consecutively. Pictures are shared with the original (same bytes, no size cost); charts, SmartArt and embedded objects are cloned, so editing the copy's chart does not change the original's. Speaker notes are copied. Returns "new_slide_indexes" — read them before editing, since inserting in the middle shifts every later slide. |
| copy_slide_between_presentationsA | Copy one slide from one open presentation into another. Use this to merge decks, or to lift a single slide out of a reference deck into the one you are building. Both presentations must be open on this server (you hold both handles). The slide keeps its own shapes, text and direct formatting, and its images and charts are copied into the target deck. Anything it inherited from its old theme — placeholder fonts, scheme colours — is re-resolved against the TARGET deck's master, so the copy can look different from the original. Inspect the result with visual_inspect_slides. layout_index: force a particular layout in the target deck. By default the layout is matched by name, then by placeholder structure; the response reports whether a real match was found in "layout_matched". |
| manage_speaker_notesA | Read, write or clear a slide's speaker notes. Notes belong in the notes pane, never in a text box on the slide itself — a "notes" textbox is visible to the audience during the presentation. operation:
"get" return the notes for slide_index, or for every slide when
slide_index is omitted;
"set" replace the notes on slide_index with |
| validate_presentationA | Check the deck for structural faults, without rendering it. Run this before export. It is fast — no rendering, no model call — and it catches the class of defect visual inspection cannot: relationships that do not resolve, charts with no data, shapes off the canvas, pictures stretched out of proportion, leftover template placeholder text, notes shared between two slides. It does NOT judge appearance. Overflowing text, overlaps and spacing are visual_inspect_slides' job; the two are complementary and a finished deck deserves both. min_severity: "error" reports only faults that can break the file in PowerPoint; "warning" (default) adds the defects a user would notice; "info" adds advisories, notably fonts this server's renderer substitutes with different metrics — which is what makes a text-fit finding from visual QA approximate. Returns "ok" (no errors), per-severity "counts", and a "problems" list where each entry names the slide, the shape, what is wrong and the tool that fixes it. |
| get_design_guidanceA | How to make the deck look like someone designed it. Read this BEFORE planning a deck, and re-read the relevant section when you hit a decision it covers. It carries what the individual tools cannot: deck structure, layout and spacing, type scale, colour, chart and table choices, the visual habits that make a deck look machine-generated, and the build loop that catches problems while they are still cheap. It also covers two things specific to this server: how differently to behave when the user supplied a corporate template (the default — you inherit their design rather than inventing one), and which fonts this server's renderer reproduces at true width, which is what determines whether you can trust a visual_inspect_slides verdict on text fit. section: omit for the whole document (a few pages), or name one — call once with no argument to see the available section names in "sections". |
| get_server_infoA | Report this server's version, how many tools it is actually exposing, and whether the optional DIAL and visual QA integrations are configured. Tool registration is dynamic — the visual QA tools appear only when a vision LLM is configured — so "tools" is counted at call time rather than hardcoded. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/photonn/dial-pptx-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server