Lingsu Slides MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SLIDESLINGSU_MCP_URL | No | URL of the running Lingsu Slides embedded MCP HTTP endpoint that the stdio bridge proxies to. | http://127.0.0.1:8765/mcp |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| document.get_stateA | Return the full document state (slides, shapes, props), undo/redo flags, and clipboard summary. |
| document.list_slidesA | List all slides in the document (id, title, shape count). |
| document.get_slideB | Get a single slide by index (default: current). |
| document.add_slideC | Append a new slide. Returns the new slide index. |
| document.remove_slideA | Delete a slide by index. Refuses if it would leave the deck empty. |
| document.reorder_slideC | Move slide src -> dst (both 0-based indices). |
| document.set_slide_titleC | Rename a slide (default: current). |
| document.set_slide_backgroundC | Set a slide's background as a hex color. |
| document.set_slide_notesB | Set or clear the speaker notes on a slide (default: current). Pass an empty string to clear. Round-trips through the |
| document.set_slide_transitionA | Set or clear a slide transition (default: current). |
| document.list_shapesB | List shapes on a slide (default: current). |
| document.get_shapeB | Look up a shape by id across all slides. |
| document.add_shapeA | Add a shape to a slide. Returns the new shape id. kinds: text / rect / ellipse / image (NamedShape subclasses — |
| document.remove_shapeC | Delete a shape by id. |
| document.move_shapeC | Translate a shape by (dx, dy) in slide coordinates. |
| document.resize_shapeC | Set a shape's box (x, y, w, h) in slide coordinates. |
| document.set_textC | Replace the text on a text/auto-shape. |
| document.set_propertyB | Set a single property on a shape (e.g. fill, stroke, font_size, bold, color). |
| document.set_rotationA | Set a shape's rotation in degrees (clockwise, 0..360). Stored on |
| document.undoB | Undo the most recent command. |
| document.redoA | Redo the most recently undone command. |
| document.can_undoA | Return whether undo/redo are possible. |
| document.copyA | Copy the given shape ids to the in-process clipboard. If shape_ids is omitted, all shapes on the current slide are copied. The clipboard is shared with the GUI (Edit → Copy / Cmd-C). |
| document.cutA | Copy the given shape ids to the clipboard AND remove them from the current slide. Each removal is a separate undo-able command. |
| document.pasteA | Paste shapes from the clipboard onto the current (or specified) slide. Each pasted shape gets a new id and is offset by (offset, offset) pt from the original so consecutive pastes cascade visibly. |
| document.duplicateA | Duplicate the given shape ids in place (slight offset). Unlike copy+paste, no clipboard side-effect. |
| clipboard.peekA | Inspect the in-process clipboard (size, is_cut, source slide, shape payloads). |
| clipboard.clearA | Empty the in-process clipboard. |
| app.new_documentB | Reset the document to a blank one with the given title. Also clears the clipboard. |
| app.open_documentA | Open a .pptx file and replace the current document. Also clears the clipboard. |
| app.save_documentA | Save to the current path; if no path set, fails (use save_document_as). |
| app.save_document_asC | Save to a specific path. |
| app.export_jsonC | Dump the document to a JSON file (lossless internal model). |
| app.export_pngB | Render a single slide to a PNG file at the slide's native resolution (default 2x = 1920x1080). Uses QGraphicsScene.render on a fresh QImage so no GUI widget needs to be shown. |
| app.export_all_pngA | Render every slide as slide_NN.png in the given directory. Returns the list of paths written. |
| app.quitA | Ask the GUI to quit (no-op in headless mode). |
| script.runB | Execute a Python string against the live Document. Bound names: document, slides, current_slide, undo_stack, rt (with add_text/add_rect/...), math, random, json. Imports, eval/exec, and dunder access are blocked. |
| script.sampleB | Return a sample script for the script editor. |
| document.copy_slideA | Copy whole slides to the slide-level clipboard. Indices default to |
| document.paste_slideA | Paste slides from the slide-level clipboard after |
| document.duplicate_slideB | Duplicate the slides at the given indices. Operates highest-index first so earlier insertions don't shift later targets. |
| document.delete_slidesB | Delete the slides at the given indices. Refuses if it would leave the deck empty. |
| document.align_shapesA | Align 2+ shapes on the current slide along one of the edges (left / center_h / right / top / center_v / bottom). Uses the bounding box of the selection as the alignment target. |
| document.reorder_shapesB | Reorder shapes on a slide (z-order). |
| document.group_shapesB | Wrap the given shape ids in a new logical Group on a slide. If any of the shapes are already in a group, the entire group is included. Returns the new group_id. |
| document.ungroupB | Remove a Group wrapper. Pass either |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 46 tools
Most tools target distinct slide, shape, document, or app operations, and descriptions clarify slide-level versus shape-level actions. However, there are several overlapping pairs: remove_slide versus delete_slides, copy_slide/paste_slide versus copy/paste for shapes, and duplicate_slide versus duplicate for shapes. These boundaries are inferable but create real misselection risk.
Names consistently use a namespace.action snake_case convention such as document.get_slide, app.save_document_as, and clipboard.peek. Minor inconsistencies appear with remove_slide/delete_slides and shape clipboard tools named copy/cut/paste rather than copy_shapes/cut_shapes/paste_shapes, but the overall pattern is predictable.
With 46 tools, the surface is very large for a slide-editing server and includes many granular operations that could be consolidated or handled through properties/scripting. While the breadth supports a full editor, the count is heavy enough to burden tool selection and maintenance.
The server covers document lifecycle, slide CRUD/duplication/reordering, shape CRUD/grouping/alignment/z-order, text and property editing, clipboard operations, export, and undo/redo. Minor gaps remain, such as inserting a slide at an arbitrary index, richer table/cell editing, and slide layout/master operations, but core workflows are complete.