Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
KS4P_MODENoStartup surface: lite (default), full, or a pack list like graphics,comlite
KS4P_PACK_POLICYNoauto (default) or locked (enable_tools refuses; surface fixed at startup)auto
KS4P_ALLOWED_ROOTSNoOpt-in path sandbox; tools refuse to touch files outside these roots

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

CapabilityDetails
tasks
{
  "list": {},
  "cancel": {},
  "requests": {
    "tools": {
      "call": {}
    },
    "prompts": {
      "get": {}
    },
    "resources": {
      "read": {}
    }
  }
}
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_presentation_viewA

The anchored markdown projection of a deck, THE cheap way to read it: slide headers with durable [s:id] anchors, one block per shape with a stable [a:hex] anchor, tables as pipe tables with t:hex:rNcN cell addresses (1-based there; table tools take 0-based row/col), notes as quoted blocks. Feed the anchors to apply_edits. scope: None for all slides, an index, {"slide_id": N}, or a list. detail: "outline", "text" (default), or "full" (geometry too). Shape and diagram editing: enable_tools(packs=['graphics']).

apply_editsA

Batch editor: many edits, one lock, one backup, one atomic save. Each edit is {"op": name, ...params} addressed by a view "anchor" (from get_presentation_view) or explicit {"slide", "shape"/"table"} keys. Ops: set_text, set_shape, set_table_cells, search_and_replace, set_placeholder_text, format_text, delete_shape. Every location is resolved BEFORE anything mutates; any stale anchor refuses the whole batch listing every failed index, and result.changed maps op index to outcome. These ops EDIT existing content; nothing here inserts shapes, tables, or slides. Creation tools live in the packs (enable_tools). atomic must stay True: v1 has no partial-apply mode. Saves atomically with two-slot backup; backup=False skips rotation.

get_textA

Plain text of the deck in reading order: shapes in spTree order, table cells tab-joined, fields rendering their cached text. scope: None for all slides, a 0-based index, {"slide_id": N}, or a list; include_notes=True appends speaker notes. Rendered-appearance checks live in the assembly-export pack. live='auto' edits the open PowerPoint copy when the file is locked by it (edits stay UNSAVED until live_save); 'force' targets the open session; 'off' refuses locked files.

find_textA

Search the deck's text. Returns every match with slide index, shape id, paragraph index, and character offsets, exactly the addresses format_text and apply_edits consume. regex=True treats query as a regular expression (guarded against catastrophic backtracking). Matches text as displayed, not raw XML, so search for & rather than &. Formatting-aware replacement lives in the graphics pack: enable_tools(packs=['graphics']).

search_and_replaceA

Deck-wide find and replace, safe across fragmented runs (each replacement keeps the first run's formatting). regex=True enables capture groups (refused live); matches overlapping slide-number/date fields are skipped. Bulk cell rewrites: set_table_cells (tables-charts pack). Saves atomically with two-slot backup; backup=False skips rotation. live='auto' edits the open PowerPoint copy when the file is locked by it (edits stay UNSAVED until live_save); 'force' targets the open session; 'off' refuses locked files.

insert_slideA

Add a slide built from a layout (name, or 0-based global index; list_elements kind='layouts' lists them), carrying the layout's placeholder skeleton so inheritance binds. position: 0-based final index, default end. Whole decks start via create_presentation (design pack). Saves atomically with two-slot backup; backup=False skips rotation. live='auto' edits the open PowerPoint copy when the file is locked by it (edits stay UNSAVED until live_save); 'force' targets the open session; 'off' refuses locked files.

delete_slideA

Delete a slide and garbage-collect everything only it used: notes, charts, embeddings, comments, custom-show references, section membership; jump links to it are neutered. slide: 0-based index or {"slide_id": N}. Prefer set_slide_hidden (design pack) when it might come back. Saves atomically with two-slot backup; backup=False skips rotation. live='auto' edits the open PowerPoint copy when the file is locked by it (edits stay UNSAVED until live_save); 'force' targets the open session; 'off' refuses locked files.

duplicate_slideA

Deep-copy a slide: notes, charts with their embedded workbooks, and embeddings are cloned and retargeted; layout and media stay shared by design; creation GUIDs are regenerated (duplicates corrupt). slide: 0-based index or {"slide_id": N}. position: 0-based final index for the copy, default right after the original. The design pack adds move and hide: enable_tools(packs=['design']). Saves atomically with two-slot backup; backup=False skips rotation.

reorder_slidesA

Rearrange the whole deck in one call. order: every current 0-based slide index exactly once, in the desired new sequence (a permutation; partial lists refuse). Durable slide_ids and view anchors survive reordering, plain indices do not. For moving ONE slide, move_slide in the design pack is simpler: enable_tools(packs=['design']). Saves atomically with two-slot backup; backup=False skips rotation.

set_placeholder_textA

Fill a layout placeholder (styling inherits from the layout). placeholder: "title", "subtitle", "body"/"content" (each matches both body and obj placeholders; exact type wins when both exist), a raw ph type, or an idx int (idx/paragraphs= file-mode only). text: newline = paragraph, leading tabs = levels; or paragraphs=[{"text": str, "level": 0..8}]. Free text boxes: graphics pack. Saves atomically with two-slot backup; backup=False skips rotation. live='auto' edits the open PowerPoint copy of a locked file.

fit_textA

Shrink overflowing text to fit: estimates the largest uniform font scale (floor min_size pt) via an average-glyph-width heuristic, rewrites explicit run sizes (or writes a normAutofit fontScale when sizes are inherited), and enables normAutofit. shape=None fits every overflowing text shape on the slide; one that cannot fit at min_size reports still_overflowing. An ESTIMATE (no font metrics): verify with export_slide_images (assembly-export pack). Saves atomically with two-slot backup; backup=False skips rotation.

get_slide_infoA

One slide in depth: durable slide_id, layout, hidden flag, notes presence, and every shape with id, name, kind, geometry in inches, placeholder type, and text preview. Shape ids here are the addresses every editing tool takes; edit what it lists via the graphics pack. slide: 0-based index or {"slide_id": N}. live='auto' edits the open PowerPoint copy when the file is locked by it (edits stay UNSAVED until live_save); 'force' targets the open session; 'off' refuses locked files.

get_presentation_infoA

Deck-level facts in one call: slide count and size, slide order with durable ids and titles, masters and layouts, section list, and notes presence. The cheap first look before get_presentation_view. Rendering, validation, and PDF export live in the assembly-export pack: enable_tools(packs=['assembly-export']).

list_elementsA

THE multiplex enumerator, one kind per call: slides, shapes, placeholders, tables, charts, images, notes, sections, layouts, masters. Returns a flat item list with ids and locations; slide-scoped kinds honor scope (None = all slides, a selector, or a list). Use it to find layout names for insert_slide and shape ids for editing. The packs (enable_tools) hold the tools that edit what this lists.

set_hyperlinkA

Set a hyperlink on a shape or text range, replacing any link already there. target: a shape id, or {"shape_id": N, "paragraph": P, "start"?: S, "end"?: E} for a text range. Exactly one destination: url (external) or to_slide (a jump by index or {"slide_id": N}, the structure delete_slide knows how to neuter). tooltip sets hover text. Navigation buttons pair with insert_shape (graphics pack). Saves atomically with two-slot backup; backup=False skips rotation.

remove_hyperlinkA

Remove hyperlinks from a shape or text range. target: a shape id (removes the shape-level link AND every run-level link inside the shape) or {"shape_id": N, "paragraph": P, "start"?: S, "end"?: E} for the covered runs only. Orphaned link rels are dropped; media playback affordances (graphics pack av inserts) are left alone. Saves atomically with two-slot backup; backup=False skips rotation.

list_hyperlinksA

Every hyperlink in scope (default all slides): external URLs and jump-to-slide links, on shapes and on text runs, with broken-target detection (missing rels, rels to deleted slides, empty URLs). The addresses reported are exactly what set_hyperlink and remove_hyperlink take. Media playback controls (insert_video/insert_audio, graphics pack) are not hyperlinks and are not listed. Read-only; the file is never modified.

copy_presentationA

Copy a deck byte-for-byte, e.g. to a working copy before heavy edits (create_snapshot names a DTG-stamped copy for you; this tool takes an explicit dest_path). Refuses an existing dest_path unless overwrite=True; an overwritten destination's previous content rotates into its .ks4p-backups prev slot first, so the overwrite is undoable via manage_backups restore. The source file is never modified.

create_snapshotA

Save a DTG-stamped permanent copy: YYYYMMDD_HHMM_.pptx (an existing leading DTG in the name is replaced, not stacked), plus an optional short label. Snapshots are the PERMANENT keepers alongside the automatic prev/anchor slots: slots rotate on every mutation, snapshots are never auto-pruned and manage_backups never touches them. Never overwrites (collisions get a numeric suffix). The source file is not modified. Take one before any large or risky editing pass.

manage_backupsA

The automatic backups under .ks4p-backups/ next to each mutated deck: prev (state before the last mutation) and anchor (session start). action='list': slots for one file_path or a whole directory, plus orphaned folders. action='restore': overwrite file_path from source ('prev', 'anchor', or a .pptx path); current content rotates into prev FIRST so the restore is undoable, and the payload is validated before the atomic replace. action='purge': scope 'orphans' or 'slots'; dry_run=True (default) reports only, dry_run=False deletes.

diagnoseA

Self-check for this environment and, optionally, one file. Reports export engine availability (PowerPoint COM vs LibreOffice), sandbox state, KS4P mode/policy env, and the current pack surface with token costs. With file_path: existence, size, PowerPoint lock state, whether the package opens, and slide count, WITHOUT mutating anything. Run it first when any tool refuses unexpectedly or an export engine seems missing. The validate tool (assembly-export pack) does the real opens-clean check in PowerPoint.

get_workflowsA

Step-by-step recipes for the common jobs, each naming the packs it needs and the exact tool order: build-a-diagram, one-call-diagram, equation-authoring (graphics), build-a-table-report (tables-charts), template-deck-setup, master-restyle, accessibility-pass (design), render-and-review, cross-deck-assembly, deck-merge (assembly-export), batch-edit-from-view (lite, the cheap loop), animate-a-build (transitions-animations), review-cycle (review), rebrand-pipeline (sweeps + design), live-session (com-live). Call with no task for the index, with a task name for full steps. Read the matching recipe before your first deck edit of a session; it prevents most wrong-tool detours.

enable_toolsA

Switch on optional tool packs mid-session; the tool list grows and your client is notified to re-fetch it. Packs: 'graphics' (shapes, connectors, groups, align, z-order, SVG to native editable shapes, diagram generators, images, video/audio, text boxes, run formatting, bullets, format painter, LaTeX equations); 'tables-charts' (tables: create, bulk cells, merge, row/column surgery, borders, styles, CSV/JSON; bar/line/pie/scatter/combo charts, formatting, data readback); 'design' (create FROM template, apply layouts, theme colors/fonts read AND write, brand extract/apply, layout guardrails, slide size, hide/move, autofit report, slide/master backgrounds, master and layout editing, accessibility audit/repair); 'assembly-export' (notes, sections, footers, PDF/PNG/handout export, validation, text extraction, cross-deck copy, deck merge/split, agenda slides, statistics, document properties, anonymize, custom shows); 'transitions-animations' (transitions, entrance animations, click builds); 'review' (threaded comments plus compare_decks); 'sweeps' (deck-wide font/color/language/logo sweeps, compress); 'com' (PowerPoint status, zombie check); 'com-live' (edit the deck OPEN in PowerPoint); 'everything' (all). Idempotent; reports approx token cost added and the active surface. disable_tools reverses.

disable_toolsA

Switch pack tools back off to shrink the tool surface (the lite core always stays on). Takes the same pack names as enable_tools, or 'everything'. Idempotent: already-disabled packs are reported, not errors. Nothing about the presentation files changes; this only trims what this session's client has to carry. Reports the approx token cost removed and the remaining active surface.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nometalalchemist/KitchenSink4PPT'

If you have feedback or need assistance with the MCP directory API, please join our Discord server