{
  "data": {
    "tool": {
      "category": "",
      "endpoint": "https://api.slideforge.dev/mcp/",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/slideforge.json",
      "kind": "mcp",
      "listed": "indexed",
      "liveUrl": "https://www.anchorterminal.com/api/v1/live/slideforge.json",
      "markdownUrl": "https://www.anchorterminal.com/tools/slideforge.md",
      "mcpTools": {
        "check": {
          "checker": "anchor-check/1.0",
          "totalTokens": 10737,
          "counts": {
            "error": 0,
            "note": 1,
            "warn": 11
          },
          "findings": [
            {
              "rule": "TC07",
              "severity": "warn",
              "tool": "create_slide",
              "message": "the description is about 1,178 tokens",
              "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "browse_catalog",
              "message": "3 parameters without a description: family, prior_id, variant",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "create_deck",
              "message": "2 parameters without a description: name, theme_id",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "create_slide",
              "message": "3 parameters without a description: form_description, metric, name",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "edit_deck",
              "message": "1 parameter without a description: slides",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "plan_slide",
              "message": "2 parameters without a description: brief, top",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "create_deck",
              "message": "slides[] (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "create_slide",
              "message": "blocks[] (object with no properties), data (object with no properties), metric (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "edit_deck",
              "message": "slides[].patch.blocks[] (object with no properties), slides[].patch.data (object with no properties), slides[].patch.metric (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "edit_slide",
              "message": "patch.blocks[] (object with no properties), patch.data (object with no properties), patch.metric (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC22",
              "severity": "warn",
              "tool": "create_slide",
              "message": "the definition is about 3,344 tokens",
              "fix": "Trim the description and parameter docs, or split the tool."
            },
            {
              "rule": "TC24",
              "severity": "note",
              "message": "9 of 9 tools have no outputSchema",
              "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
            }
          ]
        },
        "checkedAt": "2026-10-04T22:24:59Z",
        "count": 9,
        "note": "answered without the initialize handshake",
        "schemaTokens": 10737,
        "status": "ok",
        "tools": [
          {
            "name": "browse_catalog",
            "title": "Browse SlideForge's Catalog (Unified Discovery)",
            "description": "Browse the PowerPoint slide catalog progressively. No args -\u003e form overview (when-to-use, bound fields, variant counts). family=\u003cform\u003e -\u003e variant one-liners. q=\u003ctext\u003e -\u003e ranked search. variant=/prior_id= -\u003e example payload. type=schema + family -\u003e a compact family-level variant chooser (not a sendable contract); type=schema + family + variant -\u003e that variant's exact payload contract (JSON Schema, capacity, field mapping, examples). Free. Code path: type=widgets = the add_widget() catalog (name=\u003cwidget\u003e for its contract + thumbnail); type=helpers = python-pptx helper signatures. type=themes + an uploaded theme_id -\u003e that template's branded FURNITURE layouts (its own cover/agenda/divider/closing slides + fill schemas + previews) — render via create_slide(form=template_layout, theme_id, data={layout, fills}).",
            "inputSchema": {
              "properties": {
                "family": {
                  "type": "string"
                },
                "limit": {
                  "description": "Max results (with q= or family=).",
                  "type": "integer"
                },
                "name": {
                  "description": "Widget name (with type=widgets): returns the full contract + worked example + a rendered thumbnail.",
                  "type": "string"
                },
                "offset": {
                  "description": "Pagination offset (with q= or family=).",
                  "type": "integer"
                },
                "prior_id": {
                  "type": "string"
                },
                "q": {
                  "description": "Semantic search across all variants; returns ranked form/variant matches with scores.",
                  "type": "string"
                },
                "source": {
                  "description": "Theme source filter (with type=themes). Default all (built-in + your saved).",
                  "enum": [
                    "all",
                    "default",
                    "custom",
                    "saved",
                    "uploaded"
                  ],
                  "type": "string"
                },
                "theme_id": {
                  "description": "With type=themes: an uploaded theme's id -\u003e its branded furniture layouts + fill schemas (render via create_slide(form=template_layout)).",
                  "type": "string"
                },
                "top": {
                  "description": "Max results (with type=themes).",
                  "type": "integer"
                },
                "type": {
                  "description": "Omit for the form overview (or family=/q= to drill in). schema (+family, optionally +variant=) = schema-first discovery: family only returns a compact variant chooser; family+variant returns that variant's exact machine-readable payload contract (JSON Schema for data, capacity limits, intent-field mapping, examples). widgets = the add_widget() catalog for mode=code (name=\u003cwidget\u003e for its contract). helpers = python-pptx helper signatures. themes = list themes (built-in + your saved); Default appears first and can be omitted, or use any returned id as theme_id. brands = your brand kits with versions (theme_id=\u003cslug\u003e renders the default version, \u003cslug\u003e@\u003cn\u003e pins n).",
                  "type": "string"
                },
                "variant": {
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "plan_slide",
            "title": "Plan a Slide - Form + Variant Candidates",
            "description": "Plan a PowerPoint slide before rendering (free): send a short brief, get ranked candidates + a separated verdict — route (which slide: selected|needs_confirmation|ambiguous), input (can it render: ready|extractable_from_brief|needs_structured_data) and next_action. Free (one embedding). Then call create_slide with the chosen form(+variant). route.confidence: calibrated = measured P(route correct) with label high/medium/low cut on it; retrieval_score/retrieval_margin = the raw family-aggregated classifier values (not probabilities; margin can be negative when families contest); source = jev (calibrated router, took the route at \u003e=0.9) | classifier | structural_router (LLM-rescued). candidate_margin on the top candidate = literal gap between the two shown scores.",
            "inputSchema": {
              "properties": {
                "brief": {
                  "type": "string"
                },
                "escalate": {
                  "description": "Default true: on a low-confidence route the plan runs the SAME LLM rescue create_slide would (small COGS on that tail only), so plan and create always agree. Set false for a classifier-only, fully free plan (response then flags will_escalate + create_slide_behavior).",
                  "type": "boolean"
                },
                "top": {
                  "type": "integer"
                },
                "variant_policy": {
                  "description": "production_safe: if the top routed variant is draft/beta, the family's demo-safe sibling leads and route reports both best_semantic and best_production_safe.",
                  "enum": [
                    "best_semantic_match",
                    "production_safe"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "brief"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "create_slide",
            "title": "Create or Inspect a Slide",
            "description": "Create one PowerPoint slide (.pptx, native, editable) from a structured intent in ONE call: pick a `form` from the menu and put your content in the typed fields (placed on the slide as given), or pass a `brief` and let the server route it. Fields tagged (per-form) bind only where the form has that slot — ignored-with-warning elsewhere; see each form's `binds` in browse_catalog.\n\nBLOCKED (not billed)? If an error has `can_autofix:true`, merge its `patch` into the args at `patch_target`. Unchanged retries repeat the block. New form: browse_catalog(type=schema) first.\n\n\nFORM MENU:\n  agenda_list: an ordered list of sections/topics or learning objectives to walk through\n  bar_rank_chart: bars comparing magnitudes across categories\n  calendar_grid: events on a real calendar - week planner (day x hour) or month grid with event chips (data.events)\n  card_grid: several equal, unordered peer blocks (features, options, pillars, a concept's defined parts, rules/guidelines/common mistakes)\n  case_story: one named story told as evidence, proven by measured results (data.results = figures)\n  comparison_matrix: options x criteria grid: data.columns x data.rows\n  cycle_flow: a closed loop of ordered stages where the last feeds the first (recurring process)\n  data_table: a plain factual table of records by fields\n  editorial_split: two side-by-side halves: contrast (before/after, problem/solution) or copy/numbered steps beside a picture (image_src)\n  exercise_prompt: an exercise/practice/discussion prompt: instruction + hints; optional problem items with blank answer boxes\n  funnel: a quantity narrowing through ordered stages\n  gantt_plan: tasks as bars across named periods on a schedule grid\n  gauge_score: one score on a dial against a scale\n  hero_statement: a statement slide: covers (title/image-led/exec), from-\u003eto/thesis-quote transitions, statement/contact/next-steps closings; supporting points -\u003e takeaway_stack, contacts -\u003e data.contacts, next steps -\u003e data.next_steps\n  hub_spoke: one central element with several elements connected around it\n  image_story: a picture shown WHOLE (uncropped) + prose and up to 4 labelled blocks beside it, or a 1-6 picture/placeholder gallery (data.images)\n  kpi_metrics: a metrics dashboard: headline metric cards; data.sections (Highlights/Risks/Asks) makes it an exec summary / QBR snapshot\n  layer_stack: stacked layers where higher sits on, and depends on, lower\n  linear_flow: ordered process stages read left to right (or inputs to process to outputs)\n  maturity_staircase: ascending levels climbing to a higher state\n  nested_magnitude: nested containment - each level contains the next\n  org_structure: a reporting hierarchy / org tree\n  position_map: items placed by two axes - named 2x2 cells or scatter positions\n  pyramid_hierarchy: a triangle of stacked tiers, foundation to apex\n  ramp_curve: a continuous rising wedge split into phases - effort or value accumulating over time\n  section_divider: a section-break: big section number + title; blocks = agenda progress chips (emphasis=primary = current)\n  segment_wheel: a wheel of equal segments around a center - peer categories in the round (composition, not flow)\n  status_dashboard: initiatives/workstreams tracked by status, owner, progress\n  strategic_fork: one origin splitting into two mutually exclusive paths, one recommended\n  swimlane_flow: actor/function lanes by phases, task cells, handoffs across lanes\n  swot: the four-quadrant strengths / weaknesses / opportunities / threats grid\n  system_flow_map: architecture/system components: panels with internals (edges optional) or nodes wired by directed arrows\n  takeaway_stack: a title plus a few supporting points, each with one line of detail (executive summary, key findings); optional closing ask\n  timeline_roadmap: milestones/phases laid out along a time axis\n  trend_chart: one or more series plotted over time\n  value_chain: support bands over primary activity columns flowing into a goal arrowhead (data.support = the bands)\n  visual_showcase: one dominant screenshot/image with numbered callouts pointing into it\n  waterfall_bridge: a start value bridged to an end value by plus/minus contributions\n\nExact per-form data shapes: browse_catalog(type=schema, family=\u003cform\u003e) — the generated,always-current JSON Schema + a worked example. (List-shaped forms take `blocks`: [{\"label\",\"sub\",\"detail\":[str],\"emphasis\"}]; structured forms take typed `data`.)\n\nEscape modes: mode=code (caller-supplied python-pptx in sandbox — use for forms the menu cannot express: calendars, custom diagrams); mode=status (poll a job, free).\nImage-led asks (photo covers, full-bleed visuals): hero_statement + image_prompt or image_src.",
            "inputSchema": {
              "properties": {
                "allow_fabrication": {
                  "description": "Brief mode only: a bare brief on a DATA form (kpi/funnel/comparison/…) returns would_fabricate, not billed, rather than INVENT numbers. Send typed fields for verbatim, or true to let the brief author them (fidelity=ai_completed). Default false.",
                  "type": "boolean"
                },
                "allow_low_confidence": {
                  "description": "Brief routing only: by default a brief that doesn't match a form clearly returns status=needs_confirmation + candidates at cost:0 (no guessed render). Set true to render the top guess and bill it. Default false.",
                  "type": "boolean"
                },
                "allow_truncation": {
                  "description": "More items than the form holds blocks (it would drop your data); the response names the dropped count + a suggested_split. true renders the capacity subset (fidelity=verbatim_truncated). Default false.",
                  "type": "boolean"
                },
                "allow_variant_fallback": {
                  "description": "If the pinned variant is unknown, render the form's default variant (with a warning) instead of rejecting. Default false.",
                  "type": "boolean"
                },
                "blocks": {
                  "description": "list: [{\"label\",\"sub\",\"detail\":[str],\"emphasis\",\"icon\":lucide-name,\"metric\":{value,label}}]",
                  "items": {
                    "type": "object"
                  },
                  "type": "array"
                },
                "brief": {
                  "description": "prose fallback / extra context for fills",
                  "type": "string"
                },
                "caution": {
                  "description": "one-line risk / caveat callout (per-form).",
                  "type": "string"
                },
                "code": {
                  "description": "Python code defining build(prs). Canvas 13.33×7.5\", coords in inches. Pre-imported: Presentation, Inches, Pt, Emu, RGBColor, MSO_ANCHOR, PP_ALIGN. Helpers: add_text_box(slide, left, top, w, h, text, font_size=12, bold=False, color=None), add_box(slide, left, top, w, h, fill_color=None, line_color=None, corner_radius=0.05), add_icon, add_image (src = path or https://); theme_color(name) → RGBColor. add_widget(slide, name, x, y, w, h, params=|content=, theme=THEME) draws board-grade SSG widgets/charts (cards, waterfall, gantt, funnel…) — names via `browse_catalog(type=widgets)`. Use font_size=, not size=; use fill_color=, not fill=. When chrome is supplied, use `build(prs, slide)` — chrome is pre-rendered. Helper signatures: `browse_catalog(type=helpers)`.",
                  "type": "string"
                },
                "context": {
                  "description": "one-line subtitle/standfirst",
                  "type": "string"
                },
                "data": {
                  "description": "family-specific payload — see the documented shapes",
                  "type": "object"
                },
                "date": {
                  "description": "date callout (per-form).",
                  "type": "string"
                },
                "detail": {
                  "description": "Response verbosity. Default `compact`: status, form/variant, fidelity (verbatim|mixed|ai_completed), warnings[]/errors[] (only when present), urls, cost. `full` adds a debug object (engine internals, verify events, latency buckets).",
                  "enum": [
                    "compact",
                    "full"
                  ],
                  "type": "string"
                },
                "direction": {
                  "description": "rtl typesets AND mirrors the slide right-to-left (Arabic/Hebrew). Never inferred — pass it.",
                  "enum": [
                    "ltr",
                    "rtl"
                  ],
                  "type": "string"
                },
                "dry_run": {
                  "description": "Free pre-commit check (intent or mode=code), cost:0, no PPTX: status + warnings/errors, plus fidelity_forecast (verbatim|mixed|ai_completed|would_reject) and which fields bind vs get authored. Fix errors, re-call with dry_run=false to render.",
                  "type": "boolean"
                },
                "force_render": {
                  "description": "On completed_with_errors, pptx_url is null (broken slide). Set true to get it anyway. No cost/status effect.",
                  "type": "boolean"
                },
                "form": {
                  "description": "the form menu pick (see description) — the routing field",
                  "type": "string"
                },
                "form_description": {
                  "type": "string"
                },
                "headline": {
                  "description": "the assertion-style slide title",
                  "type": "string"
                },
                "highlight": {
                  "description": "one-line emphasis callout (per-form).",
                  "type": "string"
                },
                "image_prompt": {
                  "description": "generate an image when no image_src",
                  "type": "string"
                },
                "image_src": {
                  "description": "https URL | asset:\u003cid\u003e for image-bearing forms",
                  "type": "string"
                },
                "imagery": {
                  "description": "Cover/section-divider imagery: photo (default — curated stock photo, half-bleed), wash (abstract color wash), off (plain panel, no photo — only when asked). Content slides are never photo-decorated.",
                  "enum": [
                    "photo",
                    "wash",
                    "off"
                  ],
                  "type": "string"
                },
                "imagery_tag": {
                  "description": "Subject/industry: steers library photos (covers, sections, picture slides) AND the topical palette. Omit = general; `education` = teaching.",
                  "enum": [
                    "general",
                    "agriculture",
                    "construction",
                    "education",
                    "energy",
                    "finance",
                    "government",
                    "healthcare",
                    "logistics",
                    "manufacturing",
                    "retail",
                    "technology",
                    "travel"
                  ],
                  "type": "string"
                },
                "include_preview": {
                  "description": "Inline-preview PAYLOAD only (not execution). Default: default (768px). none omits the inline image and returns just the URLs — it does NOT change sync/async. Use `wait` to control execution.",
                  "enum": [
                    "none",
                    "small",
                    "default",
                    "full"
                  ],
                  "type": "string"
                },
                "job_id": {
                  "description": "Previous job ID (for mode=status, or mode=code patching)",
                  "type": "string"
                },
                "language": {
                  "description": "ISO 639-1 (default en): furniture labels and authored fills follow it.",
                  "enum": [
                    "bg",
                    "ca",
                    "cs",
                    "da",
                    "de",
                    "el",
                    "en",
                    "es",
                    "et",
                    "fi",
                    "fr",
                    "gl",
                    "hr",
                    "hu",
                    "id",
                    "is",
                    "it",
                    "ja",
                    "ko",
                    "lt",
                    "lv",
                    "nl",
                    "no",
                    "pl",
                    "pt",
                    "ro",
                    "ru",
                    "sk",
                    "sl",
                    "sr",
                    "sv",
                    "tr",
                    "uk",
                    "vi",
                    "zh"
                  ],
                  "type": "string"
                },
                "logo_id": {
                  "description": "Optional brand logo (from upload_asset purpose=logo) drawn as chrome on content slides; covers/section breaks stay clean.",
                  "type": "string"
                },
                "metric": {
                  "type": "object"
                },
                "min_font_pt": {
                  "description": "Binding type floor for prose (exhibit furniture has its own). Type grows to meet it; content that can't fit is an unbilled min_font_not_met naming the size needed. Typical: 12.",
                  "maximum": 40,
                  "minimum": 6,
                  "type": "number"
                },
                "mode": {
                  "description": "Default: structured intent / brief. safe = validate-then-render in ONE call (renders + bills only if faithful; else an unbilled invalid report with the fix — recommended, no dry_run round-trip). code = python-pptx escape. status = poll.",
                  "enum": [
                    "safe",
                    "brief",
                    "code",
                    "status"
                  ],
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "notes": {
                  "description": "Speaker notes for the presenter; never drawn on the slide.",
                  "type": "string"
                },
                "quality_profile": {
                  "description": "Thresholds layout.presentation_ready is judged against (executive strictest). Measurement only — never blocks a render or changes cost.",
                  "enum": [
                    "executive",
                    "technical",
                    "appendix"
                  ],
                  "type": "string"
                },
                "replacements": {
                  "description": "String replacements on loaded code [{old, new}] (for mode=code with job_id)",
                  "items": {
                    "properties": {
                      "new": {
                        "description": "Replacement string",
                        "type": "string"
                      },
                      "old": {
                        "description": "Exact string to find",
                        "type": "string"
                      }
                    },
                    "required": [
                      "old",
                      "new"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "source_note": {
                  "description": "source / footnote line (per-form).",
                  "type": "string"
                },
                "styling": {
                  "description": "Topical design on default themes (default on; the note names it): designed cover + a subject palette (from imagery_tag, or the brief). clean = neutral. Pins never take it.",
                  "enum": [
                    "topical",
                    "clean"
                  ],
                  "type": "string"
                },
                "subject": {
                  "description": "central entity for forms that have one — hub label, org root, section #, fork origin, media label (per-form).",
                  "type": "string"
                },
                "takeaway": {
                  "description": "optional verdict band (per-form). Put the so-what in the headline; add only for a verdict the title can't carry — not every slide.",
                  "type": "string"
                },
                "theme_id": {
                  "description": "Optional theme id from browse_catalog(type=themes). Omit for Default (slideforge_standard).",
                  "type": "string"
                },
                "variant": {
                  "description": "pin a specific variant within the form (list them via browse_catalog). Unknown variant -\u003e rejected (not billed) with the valid list; set allow_variant_fallback to render the family default instead.",
                  "type": "string"
                },
                "variant_policy": {
                  "description": "Routed-variant maturity policy: production_safe = if the ROUTED variant is draft/beta, render the family's demo-safe sibling instead (warning names both). Never overrides an explicit variant=. Default best_semantic_match.",
                  "enum": [
                    "best_semantic_match",
                    "production_safe"
                  ],
                  "type": "string"
                },
                "verify": {
                  "description": "mode=code. Default `lint`: static geometry + content checks, no LLM. `lint+vlm` adds a VLM second look (~+3s); a blank render is then an unbilled error, not a billed warning. `off` skips checks.",
                  "enum": [
                    "off",
                    "lint",
                    "lint+vlm",
                    "full"
                  ],
                  "type": "string"
                },
                "wait": {
                  "description": "AI-image slides block ~10-15s; `false` returns a job_id to poll, not block (mode=brief).",
                  "enum": [
                    "auto",
                    "true",
                    "false"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          },
          {
            "name": "create_deck",
            "title": "Create Multi-Slide Deck",
            "description": "Create a complete PowerPoint presentation (.pptx): a whole multi-slide deck, native and editable, in one call. `slides` is a list of create_slide intents (same form menu + data shapes — see create_slide). Slides fill in parallel and merge into one themed PPTX with page numbers. Include furniture: a hero_statement cover, section_divider breaks, and a closing (hero_statement variant=contact_closing via blocks-free slots).\n\nBLOCKED (not billed)? If an error has `can_autofix:true`, merge its `patch` into the args at `patch_target`. Unchanged retries repeat the block. New form: browse_catalog(type=schema) first.\n\n\n\nAlso: mode=assemble merges existing slide job_ids as-rendered (free; theme_id does NOT re-theme them — render with create_deck(slides=[…], theme_id=…) for a unified theme); mode=fork clones a deck (free).\nPolling: deck_id == job_id — manage_account(action=job, job_id=\u003cdeck_id\u003e).",
            "inputSchema": {
              "properties": {
                "allow_partial": {
                  "description": "IGNORED. A deck bills per rendered slide and always returns its pptx; slides that failed or rendered badly are free and named in repair_actions.",
                  "type": "boolean"
                },
                "deck_id": {
                  "description": "Existing deck ID (for mode=fork, or mode=render to update)",
                  "type": "string"
                },
                "direction": {
                  "description": "Deck-level writing direction, inherited by every slide (a slide-level direction wins) — set it once for an Arabic/Hebrew deck. Covers/dividers rendered on an UPLOADED brand template keep that template's own layout direction. See create_slide.direction.",
                  "enum": [
                    "ltr",
                    "rtl"
                  ],
                  "type": "string"
                },
                "dry_run": {
                  "description": "Deck-level free pre-flight (cost:0, NO render/PPTX): returns a per-slide validation manifest [{i, form, fidelity_forecast, status, errors}] so you can fix bad slides before spending. A deck is one artifact, so validation is all-or-nothing — put dry_run here, not on individual slides. Resend without dry_run to render.",
                  "type": "boolean"
                },
                "force_render": {
                  "description": "IGNORED (deck-level). pptx_url is always returned when at least one slide rendered, so there is nothing to force. Still meaningful on create_slide.",
                  "type": "boolean"
                },
                "imagery": {
                  "description": "Deck-level imagery mode, inherited by every slide (a slide-level imagery wins). See create_slide.imagery.",
                  "enum": [
                    "photo",
                    "wash",
                    "off"
                  ],
                  "type": "string"
                },
                "imagery_tag": {
                  "description": "Deck-level subject declaration, inherited by every slide (a slide-level imagery_tag wins). Declare it once for a whole deck. See create_slide.imagery_tag.",
                  "enum": [
                    "general",
                    "agriculture",
                    "construction",
                    "education",
                    "energy",
                    "finance",
                    "government",
                    "healthcare",
                    "logistics",
                    "manufacturing",
                    "retail",
                    "technology",
                    "travel"
                  ],
                  "type": "string"
                },
                "job_ids": {
                  "description": "Slide job IDs to merge (for mode=assemble)",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "language": {
                  "description": "ISO 639-1 (default en) for every slide: furniture labels and authored fills follow it.",
                  "enum": [
                    "bg",
                    "ca",
                    "cs",
                    "da",
                    "de",
                    "el",
                    "en",
                    "es",
                    "et",
                    "fi",
                    "fr",
                    "gl",
                    "hr",
                    "hu",
                    "id",
                    "is",
                    "it",
                    "ja",
                    "ko",
                    "lt",
                    "lv",
                    "nl",
                    "no",
                    "pl",
                    "pt",
                    "ro",
                    "ru",
                    "sk",
                    "sl",
                    "sr",
                    "sv",
                    "tr",
                    "uk",
                    "vi",
                    "zh"
                  ],
                  "type": "string"
                },
                "logo_id": {
                  "description": "Optional brand logo (from upload_asset purpose=logo) applied as chrome to every content slide in the deck.",
                  "type": "string"
                },
                "mode": {
                  "description": "Default render. assemble/fork are free deck plumbing.",
                  "enum": [
                    "render",
                    "assemble",
                    "fork"
                  ],
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "slides": {
                  "description": "each item is a create_slide intent (same form menu, typed fields, and data shapes as create_slide).",
                  "items": {
                    "type": "object"
                  },
                  "type": "array"
                },
                "strict_policy": {
                  "description": "Optional CI-style gate for automated report pipelines. dry_run returns policy_result; render returns rejected/cost:0 if the policy fails.",
                  "properties": {
                    "max_density": {
                      "description": "Reject slides whose quality.density is above this level.",
                      "enum": [
                        "good",
                        "medium",
                        "high"
                      ],
                      "type": "string"
                    },
                    "min_font_pt": {
                      "description": "Reject slides whose reported minimum font size is below this point size.",
                      "type": "number"
                    },
                    "reject_ai_completed": {
                      "description": "Reject slides whose content was fully AI-completed.",
                      "type": "boolean"
                    },
                    "reject_draft_variants": {
                      "description": "Reject slides rendered by a draft-maturity variant (see each slide's variant_maturity warning).",
                      "type": "boolean"
                    },
                    "reject_field_warnings": {
                      "description": "Reject slides carrying any field-binding warning (field_ignored, input_shape_hint, normalized, variant_fallback, form_rerouted).",
                      "type": "boolean"
                    },
                    "reject_ignored_fields": {
                      "description": "Reject slides whose supplied fields were not rendered (fidelity=partial / field_ignored).",
                      "type": "boolean"
                    },
                    "reject_mixed": {
                      "description": "Reject slides with mixed verbatim and AI-completed content.",
                      "type": "boolean"
                    },
                    "reject_truncated": {
                      "description": "Reject slides with truncated supplied content.",
                      "type": "boolean"
                    }
                  },
                  "type": "object"
                },
                "styling": {
                  "description": "Deck-level topical-design switch, inherited by every slide (a slide-level styling wins). See create_slide.styling.",
                  "enum": [
                    "topical",
                    "clean"
                  ],
                  "type": "string"
                },
                "theme_id": {
                  "type": "string"
                },
                "title": {
                  "description": "Deck title (PowerPoint metadata)",
                  "type": "string"
                }
              },
              "required": [],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          },
          {
            "name": "edit_slide",
            "title": "Edit a rendered slide",
            "description": "Change a slide you already rendered, in place and free: the job keeps its id and links. Send the job_id and a patch of the fields to change. Never runs a model: a brief or a picture request is refused (make a new slide for those). The response carries the slide's full current spec as `intent`. Up to 20 edits per slide.",
            "inputSchema": {
              "properties": {
                "job_id": {
                  "description": "the rendered slide's job_id",
                  "type": "string"
                },
                "patch": {
                  "additionalProperties": true,
                  "description": "the slide fields to change (same fields as create_slide). A field left out keeps its value, a field sent as null is removed, a list replaces the whole list, `data` merges key by key. Send only `notes` to add or replace speaker notes without a re-render.",
                  "properties": {
                    "allow_truncation": {
                      "description": "More items than the form holds blocks (it would drop your data); the response names the dropped count + a suggested_split. true renders the capacity subset (fidelity=verbatim_truncated). Default false.",
                      "type": "boolean"
                    },
                    "allow_variant_fallback": {
                      "description": "If the pinned variant is unknown, render the form's default variant (with a warning) instead of rejecting. Default false.",
                      "type": "boolean"
                    },
                    "blocks": {
                      "description": "list: [{\"label\",\"sub\",\"detail\":[str],\"emphasis\",\"icon\":lucide-name,\"metric\":{value,label}}]",
                      "items": {
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "caution": {
                      "description": "one-line risk / caveat callout (per-form).",
                      "type": "string"
                    },
                    "context": {
                      "description": "one-line subtitle/standfirst",
                      "type": "string"
                    },
                    "data": {
                      "description": "family-specific payload — see the documented shapes",
                      "type": "object"
                    },
                    "date": {
                      "description": "date callout (per-form).",
                      "type": "string"
                    },
                    "direction": {
                      "description": "rtl typesets AND mirrors the slide right-to-left (Arabic/Hebrew). Never inferred — pass it.",
                      "enum": [
                        "ltr",
                        "rtl"
                      ],
                      "type": "string"
                    },
                    "form": {
                      "description": "the form menu pick (see description) — the routing field",
                      "type": "string"
                    },
                    "headline": {
                      "description": "the assertion-style slide title",
                      "type": "string"
                    },
                    "highlight": {
                      "description": "one-line emphasis callout (per-form).",
                      "type": "string"
                    },
                    "image_src": {
                      "description": "https URL | asset:\u003cid\u003e for image-bearing forms",
                      "type": "string"
                    },
                    "imagery": {
                      "description": "Cover/section-divider imagery: photo (default — curated stock photo, half-bleed), wash (abstract color wash), off (plain panel, no photo — only when asked). Content slides are never photo-decorated.",
                      "enum": [
                        "photo",
                        "wash",
                        "off"
                      ],
                      "type": "string"
                    },
                    "imagery_tag": {
                      "description": "Subject/industry: steers library photos (covers, sections, picture slides) AND the topical palette. Omit = general; `education` = teaching.",
                      "enum": [
                        "general",
                        "agriculture",
                        "construction",
                        "education",
                        "energy",
                        "finance",
                        "government",
                        "healthcare",
                        "logistics",
                        "manufacturing",
                        "retail",
                        "technology",
                        "travel"
                      ],
                      "type": "string"
                    },
                    "metric": {
                      "type": "object"
                    },
                    "min_font_pt": {
                      "description": "Binding type floor for prose. Content that can't fit is refused as min_font_not_met naming the size needed. Typical: 12.",
                      "maximum": 40,
                      "minimum": 6,
                      "type": "number"
                    },
                    "notes": {
                      "description": "Speaker notes for the presenter; never drawn on the slide.",
                      "type": "string"
                    },
                    "quality_profile": {
                      "description": "Thresholds layout.presentation_ready is judged against (executive strictest). Measurement only — never blocks a render or changes cost.",
                      "enum": [
                        "executive",
                        "technical",
                        "appendix"
                      ],
                      "type": "string"
                    },
                    "source_note": {
                      "description": "source / footnote line (per-form).",
                      "type": "string"
                    },
                    "styling": {
                      "description": "Topical design on default themes (default on; the note names it): designed cover + a subject palette (from imagery_tag, or the brief). clean = neutral. Pins never take it.",
                      "enum": [
                        "topical",
                        "clean"
                      ],
                      "type": "string"
                    },
                    "subject": {
                      "description": "central entity for forms that have one — hub label, org root, section #, fork origin, media label (per-form).",
                      "type": "string"
                    },
                    "takeaway": {
                      "description": "optional verdict band (per-form). Put the so-what in the headline; add only for a verdict the title can't carry — not every slide.",
                      "type": "string"
                    },
                    "theme_id": {
                      "type": "string"
                    },
                    "variant": {
                      "description": "pin a specific variant within the form (list them via browse_catalog). Unknown variant -\u003e rejected with the valid list; null unpins.",
                      "type": "string"
                    },
                    "variant_policy": {
                      "description": "Routed-variant maturity policy: production_safe = if the ROUTED variant is draft/beta, render the family's demo-safe sibling instead (warning names both). Never overrides an explicit variant=. Default best_semantic_match.",
                      "enum": [
                        "best_semantic_match",
                        "production_safe"
                      ],
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              },
              "required": [
                "job_id",
                "patch"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "idempotentHint": true,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          },
          {
            "name": "edit_deck",
            "title": "Edit slides of a rendered deck",
            "description": "Change one or more slides of a deck you already rendered, in place and free: only the patched slides re-render, the deck is re-merged and keeps its id and links. Never runs a model: a brief or a picture request is refused. Each edited slide's entry carries its full current spec as `intent`. Up to 20 edits per deck.",
            "inputSchema": {
              "properties": {
                "job_id": {
                  "description": "the deck's job_id",
                  "type": "string"
                },
                "slides": {
                  "items": {
                    "properties": {
                      "patch": {
                        "additionalProperties": true,
                        "description": "the slide fields to change (same fields as create_slide). A field left out keeps its value, a field sent as null is removed, a list replaces the whole list, `data` merges key by key. Send only `notes` to add or replace speaker notes without a re-render.",
                        "properties": {
                          "allow_truncation": {
                            "description": "More items than the form holds blocks (it would drop your data); the response names the dropped count + a suggested_split. true renders the capacity subset (fidelity=verbatim_truncated). Default false.",
                            "type": "boolean"
                          },
                          "allow_variant_fallback": {
                            "description": "If the pinned variant is unknown, render the form's default variant (with a warning) instead of rejecting. Default false.",
                            "type": "boolean"
                          },
                          "blocks": {
                            "description": "list: [{\"label\",\"sub\",\"detail\":[str],\"emphasis\",\"icon\":lucide-name,\"metric\":{value,label}}]",
                            "items": {
                              "type": "object"
                            },
                            "type": "array"
                          },
                          "caution": {
                            "description": "one-line risk / caveat callout (per-form).",
                            "type": "string"
                          },
                          "context": {
                            "description": "one-line subtitle/standfirst",
                            "type": "string"
                          },
                          "data": {
                            "description": "family-specific payload — see the documented shapes",
                            "type": "object"
                          },
                          "date": {
                            "description": "date callout (per-form).",
                            "type": "string"
                          },
                          "direction": {
                            "description": "rtl typesets AND mirrors the slide right-to-left (Arabic/Hebrew). Never inferred — pass it.",
                            "enum": [
                              "ltr",
                              "rtl"
                            ],
                            "type": "string"
                          },
                          "form": {
                            "description": "the form menu pick (see description) — the routing field",
                            "type": "string"
                          },
                          "headline": {
                            "description": "the assertion-style slide title",
                            "type": "string"
                          },
                          "highlight": {
                            "description": "one-line emphasis callout (per-form).",
                            "type": "string"
                          },
                          "image_src": {
                            "description": "https URL | asset:\u003cid\u003e for image-bearing forms",
                            "type": "string"
                          },
                          "imagery": {
                            "description": "Cover/section-divider imagery: photo (default — curated stock photo, half-bleed), wash (abstract color wash), off (plain panel, no photo — only when asked). Content slides are never photo-decorated.",
                            "enum": [
                              "photo",
                              "wash",
                              "off"
                            ],
                            "type": "string"
                          },
                          "imagery_tag": {
                            "description": "Subject/industry: steers library photos (covers, sections, picture slides) AND the topical palette. Omit = general; `education` = teaching.",
                            "enum": [
                              "general",
                              "agriculture",
                              "construction",
                              "education",
                              "energy",
                              "finance",
                              "government",
                              "healthcare",
                              "logistics",
                              "manufacturing",
                              "retail",
                              "technology",
                              "travel"
                            ],
                            "type": "string"
                          },
                          "metric": {
                            "type": "object"
                          },
                          "min_font_pt": {
                            "description": "Binding type floor for prose. Content that can't fit is refused as min_font_not_met naming the size needed. Typical: 12.",
                            "maximum": 40,
                            "minimum": 6,
                            "type": "number"
                          },
                          "notes": {
                            "description": "Speaker notes for the presenter; never drawn on the slide.",
                            "type": "string"
                          },
                          "quality_profile": {
                            "description": "Thresholds layout.presentation_ready is judged against (executive strictest). Measurement only — never blocks a render or changes cost.",
                            "enum": [
                              "executive",
                              "technical",
                              "appendix"
                            ],
                            "type": "string"
                          },
                          "source_note": {
                            "description": "source / footnote line (per-form).",
                            "type": "string"
                          },
                          "styling": {
                            "description": "Topical design on default themes (default on; the note names it): designed cover + a subject palette (from imagery_tag, or the brief). clean = neutral. Pins never take it.",
                            "enum": [
                              "topical",
                              "clean"
                            ],
                            "type": "string"
                          },
                          "subject": {
                            "description": "central entity for forms that have one — hub label, org root, section #, fork origin, media label (per-form).",
                            "type": "string"
                          },
                          "takeaway": {
                            "description": "optional verdict band (per-form). Put the so-what in the headline; add only for a verdict the title can't carry — not every slide.",
                            "type": "string"
                          },
                          "theme_id": {
                            "type": "string"
                          },
                          "variant": {
                            "description": "pin a specific variant within the form (list them via browse_catalog). Unknown variant -\u003e rejected with the valid list; null unpins.",
                            "type": "string"
                          },
                          "variant_policy": {
                            "description": "Routed-variant maturity policy: production_safe = if the ROUTED variant is draft/beta, render the family's demo-safe sibling instead (warning names both). Never overrides an explicit variant=. Default best_semantic_match.",
                            "enum": [
                              "best_semantic_match",
                              "production_safe"
                            ],
                            "type": "string"
                          }
                        },
                        "type": "object"
                      },
                      "slide": {
                        "description": "0-based index, as slides[].i in the create_deck response",
                        "type": "integer"
                      }
                    },
                    "required": [
                      "slide",
                      "patch"
                    ],
                    "type": "object"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              },
              "required": [
                "job_id",
                "slides"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "idempotentHint": true,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          },
          {
            "name": "translate_deck",
            "title": "Translate PPTX",
            "description": "Translate a PowerPoint (.pptx) deck preserving all formatting. Supports 35 languages (Latin, Cyrillic, Greek, Chinese, Japanese, Korean). Provide job_id (from a previous create_slide/create_deck), pptx_url, or pptx_base64.",
            "inputSchema": {
              "properties": {
                "concise_mode": {
                  "description": "Prefer shorter translations for tight text boxes",
                  "type": "boolean"
                },
                "include_notes": {
                  "description": "Translate speaker notes (default false)",
                  "type": "boolean"
                },
                "include_preview": {
                  "description": "Wait+embed preview (default=wait)",
                  "enum": [
                    "none",
                    "small",
                    "default"
                  ],
                  "type": "string"
                },
                "include_tables": {
                  "description": "Translate table cells (default true)",
                  "type": "boolean"
                },
                "job_id": {
                  "description": "Source: previous slide/deck job ID (preferred — no file transfer needed)",
                  "type": "string"
                },
                "name": {
                  "description": "Job name",
                  "type": "string"
                },
                "pptx_base64": {
                  "description": "Source: Base64-encoded .pptx (max ~10 MB)",
                  "type": "string"
                },
                "pptx_url": {
                  "description": "Source: HTTPS URL to .pptx",
                  "type": "string"
                },
                "source_language": {
                  "description": "Source language or 'auto' (default auto)",
                  "type": "string"
                },
                "target_language": {
                  "description": "Target language (required)",
                  "enum": [
                    "en",
                    "de",
                    "fr",
                    "es",
                    "it",
                    "pt",
                    "nl",
                    "sv",
                    "da",
                    "no",
                    "fi",
                    "is",
                    "pl",
                    "cs",
                    "sk",
                    "hu",
                    "ro",
                    "hr",
                    "sl",
                    "et",
                    "lt",
                    "lv",
                    "ru",
                    "uk",
                    "bg",
                    "sr",
                    "tr",
                    "ca",
                    "gl",
                    "id",
                    "vi",
                    "el",
                    "zh",
                    "ja",
                    "ko"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "target_language"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "upload_asset",
            "title": "Upload or Generate Asset",
            "description": "Upload assets for PowerPoint (.pptx) generation: company template, logo, image, or document — or AI-generate an image.\n\nPurposes:\n• logo — company logo for chrome (PNG/JPG/SVG, max 5MB) → logo_id\n• image — image for the Image component (max 10MB) → asset_id\n• theme — company template PPTX → theme_id; slides with it render NATIVELY on the template (masters/layouts/chrome)\n• generate_image — AI-generate via `prompt` → asset_id\n• translate — PPTX to translate → deck job_id (requires `target_language`)\n• pdf — PDF → editable slides; pass `target_language` to also translate\n• recreate — image OF a slide → editable PPTX slide (honest annotate/preserve fallback). Use `image` to just place a picture\n\nFiles \u003e3MB (pdf/translate/theme) — and recreate on chat hosts — omit `data`: a drop-zone appears in the result card; bytes never pass through the agent.",
            "inputSchema": {
              "properties": {
                "data": {
                  "description": "Base64-encoded file content. Required for logo/image/theme/translate. Optional for pdf — omit to get a drop-zone (recommended for files \u003e3MB).",
                  "type": "string"
                },
                "filename": {
                  "description": "Original filename (for type detection)",
                  "type": "string"
                },
                "job_id": {
                  "description": "For purpose=brand: keep the look a recreate rendered in — pass that recreate's job_id and its exact kit is saved as yours (no upload, no charge).",
                  "type": "string"
                },
                "model": {
                  "description": "Explicit gateway model ID. Overrides `quality`.",
                  "type": "string"
                },
                "position": {
                  "description": "Logo position: top-left / top-right / bottom-left / bottom-right",
                  "type": "string"
                },
                "prompt": {
                  "description": "Image description (required when purpose=generate_image)",
                  "type": "string"
                },
                "purpose": {
                  "description": "Asset type (required). brand = a .pptx/.potx corporate template imported as your brand kit (theme is the same thing under its old name).",
                  "enum": [
                    "logo",
                    "image",
                    "theme",
                    "brand",
                    "generate_image",
                    "translate",
                    "pdf",
                    "recreate"
                  ],
                  "type": "string"
                },
                "quality": {
                  "description": "draft = Flux Schnell. balanced (default) = Gemini Flash Image. premium = GPT Image 2. Overridden by `model`.",
                  "enum": [
                    "draft",
                    "balanced",
                    "premium"
                  ],
                  "type": "string"
                },
                "size": {
                  "description": "Image dimensions for generate_image (default 1024×1024)",
                  "enum": [
                    "1024x1024",
                    "1792x1024",
                    "1024x1792"
                  ],
                  "type": "string"
                },
                "target_language": {
                  "description": "Required for purpose=translate. Optional for purpose=pdf — chains pdf→pptx→translate in one call.",
                  "enum": [
                    "en",
                    "de",
                    "fr",
                    "es",
                    "it",
                    "pt",
                    "nl",
                    "sv",
                    "da",
                    "no",
                    "fi",
                    "is",
                    "pl",
                    "cs",
                    "sk",
                    "hu",
                    "ro",
                    "hr",
                    "sl",
                    "et",
                    "lt",
                    "lv",
                    "ru",
                    "uk",
                    "bg",
                    "sr",
                    "tr",
                    "ca",
                    "gl",
                    "id",
                    "vi",
                    "el",
                    "zh",
                    "ja",
                    "ko"
                  ],
                  "type": "string"
                },
                "theme_id": {
                  "description": "For purpose=recreate: the brand kit or built-in theme to render the recreated slide in — your kit slug, `slug@version`, or a built-in id. Omit to keep the look of the source image.",
                  "type": "string"
                },
                "theme_name": {
                  "description": "Name for extracted theme (purpose=theme)",
                  "type": "string"
                }
              },
              "required": [
                "purpose"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "manage_account",
            "title": "Account \u0026 History",
            "description": "SlideForge account for PowerPoint generation: balance, job history, feedback, data controls. All free.\nActions: status (balance+plan), usage (spend breakdown), jobs (history), job (single job detail — slide jobs include `quality_warnings[]`; deck jobs add `slides_completed/slides_failed/failed_slides[]`), feedback (submit), feedback_list (read your reports back: status + resolution), onboarding (capabilities overview), download_url (fresh short-TTL PPTX link for an owned job — when a result carries no inline URL), security_status (retention + access-model + deletion posture), delete_job (irreversible: job + versions + files)\nAction delete_asset irreversibly deletes a user-owned uploaded/generated image asset.",
            "inputSchema": {
              "properties": {
                "action": {
                  "description": "Operation (required). feedback → report a defect or request against a render; pass job_id so it is actionable, and ask the user before filing. feedback_list → read YOUR OWN filed reports back, with `status` and the `resolution` written when one was acted on: check it before working around a defect you reported earlier, because it may already be fixed. brand_report → the per-token fidelity report for one of your brand kits (pass theme_id). reports → list report types. delete_job is irreversible. delete_asset is irreversible for user-owned image assets.",
                  "enum": [
                    "status",
                    "usage",
                    "jobs",
                    "job",
                    "download_url",
                    "feedback",
                    "feedback_list",
                    "onboarding",
                    "brand_report",
                    "reports",
                    "security_status",
                    "delete_job",
                    "delete_asset"
                  ],
                  "type": "string"
                },
                "asset_id": {
                  "description": "Image asset ID (for action=delete_asset). Logos are content-addressed/shared and are not deleted by this action.",
                  "type": "string"
                },
                "category": {
                  "description": "Feedback category (action=feedback to file under it, action=feedback_list to filter by it). The first nine are slide-quality categories — pair them with job_id.",
                  "enum": [
                    "layout",
                    "typography",
                    "contrast",
                    "content",
                    "icons",
                    "images",
                    "theme",
                    "chrome",
                    "consistency",
                    "bug",
                    "feature_request",
                    "testimonial",
                    "general",
                    "other"
                  ],
                  "type": "string"
                },
                "days": {
                  "description": "Lookback period (for action=usage, default 30)",
                  "type": "integer"
                },
                "detail": {
                  "description": "For action=status only: default false masks identity fields; true returns full email/user_id diagnostics for the authenticated user.",
                  "type": "boolean"
                },
                "include_children": {
                  "description": "For action=jobs: include deck child slides (each carries parent_deck_id) so a deck's slides are discoverable by listing. Default false (parents only). Deck rows roll child cost up to the deck.",
                  "type": "boolean"
                },
                "include_preview": {
                  "description": "Preview (for action=job)",
                  "enum": [
                    "none",
                    "small",
                    "default",
                    "full"
                  ],
                  "type": "string"
                },
                "job_id": {
                  "description": "Job ID (for action=job, action=download_url and action=delete_job)",
                  "type": "string"
                },
                "limit": {
                  "description": "Max rows (action=jobs default 10; action=feedback_list default 50, max 100)",
                  "type": "integer"
                },
                "message": {
                  "description": "What went wrong or what you want, in the user's own words (for action=feedback).",
                  "type": "string"
                },
                "severity": {
                  "description": "For action=feedback: `bug` = it is broken, `quality` = it rendered but reads poorly, `suggestion` = a request. Defaults to suggestion, so file real defects explicitly or they are triaged as wishes.",
                  "enum": [
                    "bug",
                    "quality",
                    "suggestion"
                  ],
                  "type": "string"
                },
                "slug": {
                  "description": "Report slug (for action=reports — returns one report's full metadata; omit to list all).",
                  "type": "string"
                },
                "status": {
                  "description": "Filter — action=jobs: queued/generating/complete/failed; action=feedback_list: open/resolved",
                  "type": "string"
                }
              },
              "required": [
                "action"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          }
        ]
      },
      "name": "SlideForge",
      "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
      "packages": [
        {
          "registryType": "pypi",
          "identifier": "slideforge-mcp",
          "version": "5.9.0",
          "transport": "stdio"
        }
      ],
      "pageJsonUrl": "https://www.anchorterminal.com/tools/slideforge.json",
      "popularity": {
        "githubStars": 4
      },
      "registryName": "dev.slideforge/slideforge",
      "remotes": [
        {
          "type": "streamable-http",
          "url": "https://api.slideforge.dev/mcp/"
        }
      ],
      "repository": "https://github.com/smartdatabrokers/slideforge-mcp",
      "reviewed": false,
      "slug": "slideforge",
      "source": "the official MCP registry",
      "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=dev.slideforge/slideforge",
      "summary": "Deterministic, fully editable PowerPoint from typed slide intents. 200+ layouts, brand templates.",
      "updatedAt": "2026-08-30T11:08:17Z",
      "url": "https://www.anchorterminal.com/tools/slideforge",
      "vendor": "slideforge.dev",
      "vendorUrl": "https://slideforge.dev",
      "version": "5.9.0",
      "websiteUrl": "",
      "where": "both",
      "why": [
        "vendor"
      ]
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/slideforge",
    "json": "https://www.anchorterminal.com/tools/slideforge.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/slideforge.md",
    "slim": "https://www.anchorterminal.com/tools/slideforge.min.md"
  },
  "markdown": "# SlideForge\n\n\u003e Indexed, not reviewed: facts from the official MCP registry and our own checks. No score, grade or rank, and not in the rankings until the panel reviews it. How the index works: https://www.anchorterminal.com/indexed/\n\n- Kind: MCP server, by slideforge.dev (https://slideforge.dev)\n- Listed because: It's published in the registry under slideforge.dev, a namespace the registry only gives to whoever proves they control that domain.\n- What the official MCP registry says: Deterministic, fully editable PowerPoint from typed slide intents. 200+ layouts, brand templates.\n\n## Facts\n\n- MCP registry: `dev.slideforge/slideforge` 5.9.0\n- Endpoint: https://api.slideforge.dev/mcp/ (streamable HTTP)\n- Package: pypi `slideforge-mcp` (stdio)\n- Source: https://github.com/smartdatabrokers/slideforge-mcp\n- GitHub stars: 4\n- Registry entry updated: 2026-08-30\n\n## Tools\n\n- Tools it lists (9, about 10,737 tokens of context, `tools/list` without credentials, checked 2026-10-04 22:24 UTC):\n  - `browse_catalog` (read-only): Browse the PowerPoint slide catalog progressively. No args -\u003e form overview (when-to-use, bound fields, variant counts). family=\u003cform\u003e -\u003e variant one-liners.…\n  - `plan_slide` (read-only): Plan a PowerPoint slide before rendering (free): send a short brief, get ranked candidates + a separated verdict — route (which slide:…\n  - `create_slide` (writes): Create one PowerPoint slide (.pptx, native, editable) from a structured intent in ONE call: pick a `form` from the menu and put your content in the typed…\n  - `create_deck` (writes): Create a complete PowerPoint presentation (.pptx): a whole multi-slide deck, native and editable, in one call. `slides` is a list of create_slide intents (same…\n  - `edit_slide` (writes): Change a slide you already rendered, in place and free: the job keeps its id and links. Send the job_id and a patch of the fields to change. Never runs a…\n  - `edit_deck` (writes): Change one or more slides of a deck you already rendered, in place and free: only the patched slides re-render, the deck is re-merged and keeps its id and…\n  - `translate_deck` (writes): Translate a PowerPoint (.pptx) deck preserving all formatting. Supports 35 languages (Latin, Cyrillic, Greek, Chinese, Japanese, Korean). Provide job_id (from…\n  - `upload_asset` (writes): Upload assets for PowerPoint (.pptx) generation: company template, logo, image, or document — or AI-generate an image. Purposes: • logo — company logo for…\n  - `manage_account` (writes): SlideForge account for PowerPoint generation: balance, job history, feedback, data controls. All free. Actions: status (balance+plan), usage (spend breakdown),…\n- How its tools read to an agent (0 errors, 11 warnings, 1 note, about 10,737 tokens; rules at https://www.anchorterminal.com/check.md; not part of the score):\n  - warn TC07 create_slide: the description is about 1,178 tokens\n  - warn TC11 browse_catalog: 3 parameters without a description: family, prior_id, variant\n  - warn TC11 create_deck: 2 parameters without a description: name, theme_id\n  - warn TC11 create_slide: 3 parameters without a description: form_description, metric, name\n  - warn TC11 edit_deck: 1 parameter without a description: slides\n  - warn TC11 plan_slide: 2 parameters without a description: brief, top\n  - warn TC13 create_deck: slides[] (object with no properties)\n  - warn TC13 create_slide: blocks[] (object with no properties), data (object with no properties), metric (object with no properties)\n  - warn TC13 edit_deck: slides[].patch.blocks[] (object with no properties), slides[].patch.data (object with no properties), slides[].patch.metric (object with no properties)\n  - warn TC13 edit_slide: patch.blocks[] (object with no properties), patch.data (object with no properties), patch.metric (object with no properties)\n  - warn TC22 create_slide: the definition is about 3,344 tokens\n  - note TC24 server: 9 of 9 tools have no outputSchema\n\n- JSON: https://www.anchorterminal.com/api/v1/tools/slideforge.json\n- Being indexed says nothing about quality, and nobody can pay for it. Ask for a review: https://www.anchorterminal.com/builders/#claiming\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-04",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Indexed",
        "url": "https://www.anchorterminal.com/indexed/"
      },
      {
        "name": "SlideForge",
        "url": ""
      }
    ],
    "description": "SlideForge, an MCP server by slideforge.dev, listed from the official MCP registry. Indexed, not reviewed: facts and our own checks, no score or ranking. Deterministic, fully editable PowerPoint from typed slide intents. 200+ layouts, brand templates.",
    "facts": [
      "not reviewed",
      "not ranked",
      "facts only"
    ],
    "h1": "SlideForge",
    "image": "https://www.anchorterminal.com/assets/og/indexed.png",
    "path": "/tools/slideforge",
    "published": "",
    "section": "indexed",
    "title": "SlideForge: MCP server, indexed from the official MCP registry",
    "toc": null,
    "updated": "2026-10-04",
    "url": "https://www.anchorterminal.com/tools/slideforge"
  },
  "tokens": {
    "markdown": 1200,
    "slim": 1130
  },
  "version": 1
}
