Skip to content

ToolsEnabled Slides 0.1.0 (beta)

Pre-release
Pre-release

Choose a tag to compare

@JoshuaPinckard JoshuaPinckard released this 02 Oct 07:24
· 30 commits to main since this release

ToolsEnabled Slides 0.1.0 (beta) lets an AI agent build and edit real PowerPoint decks through MCP while you watch in a local browser studio. You keep pause, resume, undo and redo in a private dashboard, and the agent can export PPTX, PDF and PNG. Slides makes no model calls of its own and needs no account, API key or internet connection. MIT licensed. This is the first public release: a prerelease published only here on GitHub Releases, not listed in any plugin marketplace or directory.

What it does

  • 36 MCP tools to read a deck, add and edit slides, text, bullets, speaker notes, shapes, images, video, styles and transitions, import an existing .pptx, check quality with ppt_lint, and export.
  • You stay in control. Edits appear live in the studio. Pause, resume, undo, redo, protecting slides or objects, and downloads work only in your dashboard session, which you open with a one-time link Slides prints at startup. They are not MCP tools.
  • Several agents, one deck. An agent must lock a slide before editing it and can release only its own locks. A shared board carries notes and house rules.
  • Careful import. Macros, OLE and ActiveX objects, external links, embedded Excel workbooks (including ordinary Excel-backed charts), SVG, WMF/EMF and other unsupported images, and imported video are refused. GIF and APNG images keep their animation in PPTX exports; PDF and PNG show the first frame.
  • Exports never overwrite. Each export writes a new file or folder inside the workspace. PPTX needs only Python; PDF and PNG use LibreOffice.
  • Offline, pinned runtime. Slides' Python packages are installed from hash-pinned wheels into a separate folder you choose. Nothing installs itself at startup.

Install (Linux x86_64)

You need Node.js 22 or later, CPython 3.12 and glibc 2.28 or later. For PDF and PNG you also need LibreOffice Impress (sudo apt-get install libreoffice-impress on Ubuntu); PPTX export works without it.

  1. Download toolsenabled-slides-0.1.0.zip, toolsenabled-slides-0.1.0-cp312-linux-x86_64-wheels.zip and both .sha256 files, then run sha256sum -c toolsenabled-slides-0.1.0.zip.sha256 toolsenabled-slides-0.1.0-cp312-linux-x86_64-wheels.zip.sha256.

  2. Extract both ZIPs. Prepare the Python runtime in a new folder outside the Slides folder (its parent folder must exist):
    python3.12 /absolute/slides/tools/setup-runtime.py --runtime "/absolute/private/Slides Runtime" --wheels /absolute/downloads/cp312-linux-x86_64 --pip-wheel /absolute/downloads/cp312-linux-x86_64/pip-24.3.1-py3-none-any.whl
    It checks every wheel against the hashes in the source, installs only those wheels and prints the runtime's Python path.

  3. Pick an absolute workspace folder for your deck, outside the Slides folder, and print the registration for your client. The helper only prints; it changes nothing. Set SUITE_PYTHON first, or the helper prints your system Python, which doesn't have Slides' packages.

    export SLIDES_WORKSPACE=/absolute/decks/project-update
    export SUITE_PYTHON="/absolute/private/Slides Runtime/bin/python"
    node /absolute/slides/tools/mcp-config.mjs --client claude
    
    • Claude Code: run the printed claude mcp add command from your presentation project.
    • Codex: use --client codex and run the printed codex mcp add command.
    • DeepSeek Harness: use --client deepseek and add the printed extension block to your harness configuration.

    Use a separate workspace and port (SUITE_PORT) for each deck you have open at the same time.

  4. Open the dashboard link yourself before giving the agent any work, and never ask the agent to fetch it. The simplest way for any client: with the same SLIDES_WORKSPACE and SUITE_PYTHON set, run node /absolute/slides/src/cli/studio.js in a terminal. Open the one-time link it prints, keep that tab, then start your agent, which attaches to that studio. In Claude Code you can instead start claude --debug-file /absolute/private/claude-debug.log and find /studio#launch= in that file.

  5. Then ask, for example: "Use Slides to make a three-slide project update. Read the board and outline, lock the slides, then export update.pptx and update.pdf."

The ZIP also contains Claude Code and Codex plugin manifests and a workflow skill. Their plugin marketplace isn't published yet, so the claude plugin marketplace add ToolsEnabled/toolsenabled-plugins step in docs/CLAUDE-INSTALL.md doesn't work yet. Use the registration above until it does.

Tested on this exact release (source commit ee8fe7a, tag v0.1.0; ZIP SHA-256 cc547ff8d9295b206f22459723eca95f5b8c0aaccdad35bfcaa51ca68ace7ba7)

  • 95 of 95 test runs passed headless, from source and from the extracted ZIP. On the exact ZIP, the MCP lifecycle check passed 9 of 9: 36 tools, 3 slides, locks, PPTX export and re-import, attach and detach, and clean shutdown.
  • The ZIP rebuilds byte for byte from this public source with its own tools/package.py. The Linux wheel bundle rebuilds byte for byte from its pinned wheels with tools/package-wheels.py.
  • LibreOffice 24.2.7.2 on Linux (during the code review): the lifecycle check with PDF and PNG output passed 9 of 9. A 200-slide deck was imported and exported to PPTX, PDF and 200 PNGs. Pages with animated GIF and APNG images rendered their first frame, and the original image bytes came through PPTX export unchanged.
  • Codex plugin loading, no model: Codex 0.158.0 installed the plugin from this exact ZIP into fresh, empty profiles with a scrubbed environment. It listed all 36 tools and used the configured workspace and the prepared Python. With the server entry removed, with no settings forwarded, or with the Python setting not forwarded (even with a working .venv inside the plugin), it started no tools, each for the expected reason.
  • Real Claude Code turn: Claude Code 2.1.287 installed the plugin from a local copy of this release's exact 178 source files, using a fresh plugin cache. The model saw all 36 Slides tools. In one turn it made 20 Slides calls with no errors, locked every slide before editing it, got a clean lint, released its locks and exported update.pptx. An independent check confirmed the 3 slides, their text and the speaker notes.
  • Independent security reviews over several rounds, ending with a focused review of the final changes: nothing at Critical, High or Medium severity. The two Low findings are listed below.

Tested on an earlier 0.1.0 candidate (not these exact bytes)

  • DeepSeek Harness (DeepSeek V4.1 Flash through NVIDIA's OpenAI-compatible endpoint), registered from the helper's output with the Python path added by hand: 17 Slides calls, a lock before every edit, no tool errors, and an export that passed the same independent check. It didn't run lint, because DeepSeek has no workflow skill and the prompt didn't ask for it. A separate lint of its result was clean.
  • A Codex editing turn, registered directly rather than as a plugin: 22 Slides calls, a lock before every edit, a clean lint and a verified export.
  • The first full LibreOffice run, with the same 200-slide and animated-image checks.
  • That candidate's security review found three Medium issues, all fixed in this release. Since then, this release has tightened checks on the files inside imported decks, made both plugins require the prepared Python runtime and refuse overlapping folders, stopped Python from writing cache files into the plugin, and changed one tool's schema so Claude Code sees all 36 tools (it saw 35 before). It also adds the Python path to every printed registration. The tests and client checks above cover these changes, but no DeepSeek or Codex editing turn has been rerun on them.

Known limits

  • Only Linux x86_64 was tested. macOS and Windows are not qualified, and their wheel bundles are not attached. Native Claude Desktop installation is not qualified either: no Desktop bundle (.mcpb) is attached, and no production-signed bundle exists.
  • Claude Code installing straight from this release's download link has not been tested yet. The real Claude Code turn used a local copy with the same plugin files, and the direct claude mcp add registration above was not part of that turn.
  • Terminal studio workspace check (Low). src/cli/studio.js creates its workspace folder before checking it. If SLIDES_WORKSPACE is unset, empty, relative or starts with ~, the studio creates and uses a folder under the current directory (for example, one literally named ~). This happens even in plugin mode, where the MCP server itself would refuse. A workspace inside the plugin's install folder is created before it is refused. Always set an absolute workspace outside the Slides folder.
  • Test record correction (Low). One pre-release Codex plugin-loading check for this release ran in a signed-in Codex profile instead of an empty one, and its record said otherwise. It made no model calls and didn't change the release files. The Codex result above comes from the later check in fresh, empty profiles.
  • PDF and PNG are static. Fonts, effects and complex formatting can differ between LibreOffice and PowerPoint, so check exported pages before sharing. Native object animations and embedded MP4 playback need desktop PowerPoint on Windows, which is not qualified.
  • Imports are limited to 32 MiB and 200 slides. Replace embedded Excel charts with images before importing.
  • Slides is a local, single-user app. A process running as the same user can act as you, and an agent with file or shell tools can read an unused dashboard link from host logs. Don't expose its port through a tunnel or proxy. See SECURITY.md.
  • A checksum shows the content is identical; it isn't a publisher signature.

ToolsEnabled is not affiliated with or endorsed by Anthropic, OpenAI, DeepSeek, Cursor or NVIDIA.