ppt-generator
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| AWS_REGION | No | AWS region for Bedrock. | us-east-1 |
| PPT_LOG_DIR | No | Directory for per-project log files. | |
| LLM_PROVIDER | No | LLM provider: 'bedrock' or 'anthropic'. Auto-selected based on ANTHROPIC_API_KEY presence. | bedrock |
| PPT_LOG_FILE | No | Single log file path (legacy). Ignored when PPT_LOG_DIR is set. | |
| ANTHROPIC_API_KEY | No | Anthropic API key. Required if using Anthropic provider. | |
| AWS_ACCESS_KEY_ID | No | AWS access key ID for Bedrock IAM authentication. | |
| VISUAL_QA_PARALLEL | No | Number of parallel workers for Visual QA. | 8 |
| AWS_SECRET_ACCESS_KEY | No | AWS secret access key for Bedrock IAM authentication. | |
| AWS_BEARER_TOKEN_BEDROCK | No | Bearer token for Bedrock authentication. | |
| VISUAL_QA_MAX_ITERATIONS | No | Maximum fix iterations for Visual QA. | 2 |
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 |
|---|---|
| prepare_outlineA | Prepares the prompt + JSON schema for the CLIENT to generate a slide outline. This tool does NOT call an LLM. It normalizes inputs, creates/loads the
project, saves the presentation metadata, and returns the system prompt,
user prompt, and the JSON schema the outline must conform to. You (the
client) then generate the outline JSON that follows Missing non-sensitive presentation conditions may use the defaults below or be inferred from the user's brief. Do not invent presenter identity. Args: topic: Presentation topic (e.g., "2024 Cloud Computing Trends") purpose: Presentation purpose (empty = general presentation). audience_type: "general" | "technical" | "executive". presentation_minutes: 3~60 min. num_slides: Recommended number of slides (0 = auto-calculate from presentation time). presenter_name: Presenter's name (empty = omit presenter block). presenter_title: Presenter's job title. presenter_org: Presenter's organization. project_id: Project ID (auto-generated if not specified) Returns: JSON string with: system_prompt, user_prompt, response_schema, project_id. Next step: Generate the outline JSON matching |
| ingest_outlineA | Ingests the client-generated outline JSON: validates, injects presenter info, saves. Call this AFTER An end-to-end deck request may proceed directly to design after this call. Stop for confirmation only when the user requested an outline-only result or explicitly asked to approve the slide composition. Args: project_id: Project ID returned by prepare_outline (required). outline_json: The outline JSON generated by the client, matching the schema from prepare_outline ({"slides": [...]}). Returns: JSON string containing outline_path and project_id. |
| prepare_design_doc_draftA | Prepares the prompt for the CLIENT to draft DESIGN.md (design intent). No LLM call. If DESIGN.md already exists, returns {"skip": true} — reuse the
existing design intent (do not regenerate). Otherwise returns system_prompt,
user_prompt, response_schema, and project_id. Generate the draft JSON
(theme + tone + anti_slop + page_requests) matching response_schema, then call
Call this ONCE before generating slides, so every slide shares one design theme and narrative arc. Args: project_id: Project ID. Loads outline from the saved project. outline_json: Full outline JSON. Optional if project_id is given. color_theme: Color theme ("dark" or "light", default: "dark"). Returns: JSON with system_prompt, user_prompt, response_schema, project_id, color_theme — or {"skip": true}. |
| ingest_design_doc_draftA | Ingests the client-generated DESIGN.md draft and saves DESIGN.md. Call AFTER prepare_design_doc_draft with the draft JSON you generated. Args: project_id: Project ID (required). draft_json: Draft JSON (theme + tone + anti_slop + page_requests) from the client. color_theme: Color theme (stored into the theme). Returns: JSON with project_id and design_doc_path. |
| prepare_design_slideA | Prepares the prompt + JSON schema for the CLIENT to generate ONE slide's design spec. No LLM call. Returns the system prompt, user prompt (with adjacent-slide
context and DESIGN.md directives baked in), the Parallelize across slides: call prepare→generate→ingest for each slide
concurrently. Slides are independent server-side. Call
Args: project_id: Project ID (required). slide_index: 1-based slide number to generate. outline_json: Full outline JSON. Optional if project_id has a saved outline. total_slides: Total slide count (0 = infer from outline). color_theme: Color theme ("dark" or "light"). Returns: JSON with system_prompt, user_prompt, response_schema, slide_type, thinking_budget, project_id, slide_index. |
| ingest_design_slideA | Ingests the client-generated slide spec: validate, normalize, save, render, lint. Call AFTER prepare_design_slide with the spec JSON you generated. Args: project_id: Project ID (required). slide_index: 1-based slide number (same as prepare). spec_json: The slide spec JSON generated by the client, matching the schema. generation_context: Opaque token returned by prepare_design_slide. color_theme: Color theme ("dark" or "light"). Returns: JSON with status, slide_file, slide_html_path, optional lint and overflow. After ingesting ALL slides, call |
| finalize_design_specA | Finalizes a freshly generated deck: builds slides.html, runs deck-wide lint. No LLM call. Call ONCE after all slides have been ingested via
Args: project_id: Project ID (required). overflow_json: JSON array of overflow items collected from ingest calls (optional, "" if none). Returns: JSON with design_spec_dir, slide_count, slides_html_path, lint, overflow. IMPORTANT — Required follow-up: call |
| move_slideA | Moves a slide from one position to another. No LLM call — pure file reordering. Reorders all related files (outline, design_spec, slide HTML) atomically.
After this call, you must call Args: project_id: Target project ID (required) from_index: Current slide position (1-based). to_index: Desired slide position (1-based). Returns: JSON string containing project_id, slide_count, from_index, to_index. |
| delete_slideA | Deletes a slide. No LLM call — pure file removal + reindex. Args: project_id: Target project ID (required) slide_index: Slide position to delete (1-based). Returns: JSON string containing project_id and the new slide_count. After this call, call |
| prepare_slide_editA | Prepares to add or update ONE slide without changing project files. No LLM call. Returns the slide generation prompt, For narrow single-element tweaks, use Args: project_id: Target project ID (required). action: "add" | "update". slide_index: 1-based position. add: insertion point (-1 = end). update: target. title: Slide title (required for add; required for update on imported projects). content_summary: Content description (required for add; required for update on imported). component_hint: Layout hint (default: "bullets"). slide_type: "title" | "content" | "closing" | "agenda" (default: "content"). speaker_notes: Optional speaker notes. color_theme: Color theme ("dark" or "light"). Returns: JSON with prompts, response_schema, action, project_id, edit_context. |
| ingest_slide_editA | Ingests an add/update slide spec: validate, save (insert for add), render, lint. Call AFTER prepare_slide_edit with the same action/slide_index, returned edit_context, and your spec JSON. Args: project_id: Target project ID (required). action: "add" | "update" (same as prepare). slide_index: 1-based position (same as prepare; use the insertion point for add). spec_json: The slide spec JSON generated by the client. edit_context: Opaque token returned by prepare_slide_edit. color_theme: Color theme ("dark" or "light"). Returns: JSON with design_spec_dir, slide_count, slide_index, slide_html_path, optional lint. IMPORTANT — Required follow-up: call |
| prepare_modify_componentA | Prepares a narrow single-component edit on a content slide. No LLM call. Returns a generation task with
Use for narrow changes like "make the LLM box red". For broader changes use
Args: project_id: Target project ID (required). slide_index: 1-based slide position. component_id: Target component id from design_doc.layout leaf. instruction: Natural-language description of the change. color_theme: Color theme ("dark" or "light"). Returns: JSON with system_prompt, user_prompt, response_schema, stage, project_id, slide_index, component_id. |
| ingest_backfillA | Ingests the design_doc backfill for an imported slide (stage="backfill"). Call AFTER a prepare_modify_component that returned stage="backfill".
Saves the backfilled design_doc and returns Args: project_id: Target project ID (required). slide_index: 1-based slide position. backfill_json: The backfill JSON generated by the client. Returns: JSON with status="backfilled", available_components. |
| ingest_modify_componentA | Ingests a single-component edit: validate, apply to exactly one element, save, render. Call AFTER a prepare_modify_component that returned stage="modify". Args: project_id: Target project ID (required). slide_index: 1-based slide position. component_id: Target component id (same as prepare). modify_json: The ComponentModify JSON generated by the client. edit_context: Opaque context returned by prepare_modify_component. color_theme: Color theme ("dark" or "light"). Returns: JSON with modified_element, slide_html_path, optional lint. After this call, share the returned slide_html_path with the user. |
| prepare_reviewA | Prepares a design-rule review task for ONE slide (mechanical lint baked in as a hint). No LLM call. Returns the review prompt + Args: project_id: Target project ID (required). slide_index: 1-based slide position. Returns: JSON with system_prompt, user_prompt, response_schema, project_id, slide_index. |
| ingest_reviewA | Ingests a slide's review result: validate, return issues (report-only). Call AFTER prepare_review. Does NOT auto-regenerate. If has_high_severity,
the response includes Args: project_id: Target project ID (required). slide_index: 1-based slide position. review_json: The review result JSON generated by the client. review_context: Opaque token returned by prepare_review. Returns: JSON with has_high_severity, issues, optional fix_feedback. |
| prepare_deck_reviewB | Prepares one read-only grounding and narrative review for the whole deck. Generate JSON matching the returned response_schema, then call
|
| ingest_deck_reviewC | Validates a deck review result and reports semantic issues without editing. |
| export_pptxB | Exports the design spec as an editable PPTX file. Operates in two modes:
Args: design_spec_json: Design spec JSON string project_id: Project ID (auto-generated if not specified). When provided alone, auto-loads the design spec Returns: JSON string containing project_id and pptx_path |
| import_pptxA | Imports an external PPTX file and converts it to a design spec for editing. Reads the PPTX file, extracts all design elements (shapes, textboxes, images, backgrounds, speaker notes), and creates a new project with the design spec. HTML preview is automatically generated. After import, you can use prepare_slide_edit / ingest_slide_edit, prepare_modify_component / ingest_modify_component, export_html, export_pptx, and the visual QA tools on the imported project. Args: file_path: Absolute path to the PPTX file to import project_id: Project ID (auto-generated if not specified) Returns: JSON string containing project_id, num_slides, slides_html_path, lint, and warnings |
| export_htmlA | Generates per-slide HTML files and an iframe container based on the design spec. Operates in two modes:
Each slide is generated as slides/slide_NN.html, and slides.html is the iframe container. Args: design_spec_json: Design spec JSON string project_id: Project ID (auto-generated if not specified). When provided alone, auto-loads the design spec Returns: JSON string containing session_id, slides_html_path, slide_count, project_id |
| list_projectsA | Retrieves the list of existing projects. Checks the ~/.ppt-generator/ directory and returns the list of saved projects. Includes each project's ID, topic, slide count, completed steps, source, and creation time. Most recent projects are listed first. The "source" field indicates how the project was created:
When to use: Always call this tool first before starting the PPT generation pipeline.
Returns: Project list JSON string. Empty array [] if no projects exist. |
| load_project_statusA | Loads project status and metadata. Checks the saved project's topic, slide count, and completion status of each step. The "source" field indicates how the project was created:
For imported projects: Since there is no outline, skip outline modification steps. Use prepare_slide_edit / ingest_slide_edit or prepare_design_slide / ingest_design_slide directly to modify slides. Args: project_id: Project ID Returns: Project metadata JSON string including source field |
| load_outlineA | Loads the saved outline JSON. Retrieves the previously generated slide outline from the project directory. The loaded result can be used directly as input for prepare_design_slide or export_html. Args: project_id: Project ID include_content: If True, returns full slide outline content alongside path. Defaults to False (path and slide_count only). Returns: JSON string containing outline_path, slide_count, and optionally slides array |
| save_outline_slideA | Saves (overwrites) a single slide outline to the project. Creates or overwrites the outline file for a specific slide index. Use this before calling prepare_slide_edit(action="update") to provide the updated slide content that the LLM will use for design spec generation. For adding new slides: Use prepare_slide_edit(action="add") directly — it accepts outline parameters (title, content_summary, etc.) and handles all file shifts automatically. No need to call this tool first. For updating existing slides:
Args: project_id: Target project ID (required) slide_index: Target slide position (1-based). E.g., 1 for the first slide. title: Slide title content_summary: Detailed slide content description for the LLM component_hint: Layout hint ("bullets", "step_cards", "comparison_table", "arch_diagram", etc.) slide_type: Slide type ("title", "content", "closing", "agenda") speaker_notes: Optional speaker notes layout_plan: Content layout plan (arrangement direction, elements, relationships) Returns: JSON string containing project_id, slide_index, outline_path |
| load_design_specA | Loads the saved design spec. Retrieves the previously generated design spec (PptxSlideSpec JSON) from the project directory. The project_id can be passed to export_html(project_id=...) or export_pptx(project_id=...). Args: project_id: Project ID Returns: JSON string containing design_spec_dir, slide_count, slide_files |
| prepare_speaker_scriptA | Prepares a deck-wide spoken script task for the ppt-speaker-script skill. Use after design or PPTX import. Returns actual slide specs, existing notes, outline evidence when available, presentation context, response_schema, and script_context. The client writes the script; the server never calls an LLM. Args: project_id: Existing project with a completed design spec. brief: User's language, audience, time, delivery, and Q&A preferences. |
| ingest_speaker_scriptA | Validates and saves notes only, preserving the deck's visual content. Rejects stale context, missing/duplicate/out-of-range slides, and schema violations before saving. Synchronizes existing outline notes and writes speaker-script.md from the same source. Export HTML/PPTX at the final checkpoint to refresh those artifacts. Args: project_id: Same project used in prepare_speaker_script. script_json: JSON matching the response_schema returned by prepare. script_context: Opaque context returned by that prepare call, unchanged. |
| export_speaker_scriptA | Exports speaker-script.md from current saved notes without generation. Call again at the stable checkpoint after slide edits, moves, or deletion. Preserves slide order and the notes' meaningful line breaks. Args: project_id: Existing generated or imported project. |
| capture_slidesA | Captures slide screenshots via Playwright (server-side). No LLM call. Phase 1 of visual QA. Renders the current slide HTML to PNG so the CLIENT can
analyze them for visual defects. Requires: Args: project_id: Target project ID (required). slide_indices: 1-based comma-separated indices (e.g. "1,3,5"). Empty = all. iteration: Iteration counter (0-based) — screenshots are versioned per iteration. Returns: JSON with project_id, iteration, screenshots: [{slide_index, screenshot_path}]. Next: for each captured slide, call |
| prepare_visual_qa_analysisA | Prepares the vision analysis task for ONE captured slide. No LLM call. Returns the system prompt, user prompt, Args: project_id: Target project ID (required). slide_index: 1-based slide position. iteration: Iteration counter matching the capture (default 0). screenshot_path: Optional client-captured PNG path. When supplied, it is validated and used instead of requiring Playwright capture. Returns: JSON with system_prompt, user_prompt, response_schema, images, project_id, slide_index. |
| ingest_visual_qa_analysisA | Ingests the client-generated analysis: validate, report issues. No fix applied. Call AFTER prepare_visual_qa_analysis and echo its prepared_context token. Missing or stale context is rejected; restart from prepare after upgrading an older client. If has_issues, pass analysis_context to prepare_visual_qa_fix. Args: project_id: Target project ID (required). slide_index: 1-based slide position. analysis_json: The analysis JSON generated by the client. prepared_context: Opaque token from the same analysis prepare response. Returns: JSON with has_issues, issues (dicts to feed into the fix step), overall_quality. |
| prepare_visual_qa_fixA | Prepares the fix task for a slide with detected issues. No LLM call. Returns the fix prompt, Args: project_id: Target project ID (required). slide_index: 1-based slide position. analysis_context: Opaque context returned by ingest_visual_qa_analysis. iteration: Iteration counter matching the capture (default 0). Returns: JSON with system_prompt, user_prompt, response_schema, images, project_id, slide_index. |
| ingest_visual_qa_fixA | Ingests the client-generated fix: validate, save, re-render HTML. Call AFTER prepare_visual_qa_fix. Restores images/slide_type the LLM can't produce. Re-run capture → analysis on this slide to verify (up to max_iterations). Args: project_id: Target project ID (required). slide_index: 1-based slide position. fix_json: The visual patch JSON generated by the client. fix_context: Opaque context returned by prepare_visual_qa_fix. Returns: JSON with status ("fixed" | "unfixed" | "unresolved"), slide_html_path. |
| finalize_visual_qaA | Rebuilds the deck container HTML + full export after visual QA fixes. No LLM call. Call ONCE after all fix iterations are done. Args: project_id: Target project ID (required). Returns: JSON with project_id, slides_html_path, and pptx_path when export succeeds. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 35 tools
The prepare_X/ingest_X pairing gives each tool a clear role, and descriptions carefully distinguish overlapping tools (e.g., prepare_modify_component is "narrow" vs prepare_slide_edit "broad", per-slide review vs prepare_deck_review). A few boundaries remain blurry — prepare_design_slide vs prepare_slide_edit(action=update) both generate slide specs, and prepare_review vs prepare_visual_qa_analysis are adjacent QA steps — but the docs resolve most of it.
Every tool follows a predictable snake_case verb_noun pattern (prepare_*, ingest_*, export_*, load_*, save_*, finalize_*), with the prepare/ingest symmetry making the two-phase pipeline obvious. Minor outliers like move_slide, delete_slide, capture_slides, and import_pptx still fit the same verb_noun convention.
At 35 tools this is well above the well-scoped range, and the count is inflated by the prepare/ingest doubling of nearly every operation. Each tool has a role, but the surface is heavy for what is fundamentally a deck-build/edit/export pipeline.
The surface covers the full lifecycle: import, outline, design doc, per-slide design, slide add/update, component edits, move/delete, per-slide and deck review, visual QA capture/analyze/fix, speaker script, and HTML/PPTX export plus project management. No obvious dead ends for the stated purpose.