Skip to main content
Glama

Publish a presentation you narrated yourself

publish_narrated_presentation
Destructive

Publish an html-presentation/v1 document using audio YOU synthesized locally (e.g. with bisque-voice) — free, unlimited, and works on macOS, Linux and Windows. Send each narrated slide's word timings and MP3 metadata; the server assembles presentation.json (recomputing cues from your narration markers) and returns one upload URL per MP3. Then PUT each file and POST the returned completeUrl with the returned files array. RE-PUBLISHING: audio is optional — any narrated slide you omit reuses the audio from the last publish whenever its narration text and speechSpeed are unchanged, so an HTML-only edit needs no synthesis at all. The response reports reused, synthesized, and staleSlides (narrated slides whose text changed and have no audio — synthesize exactly those and publish again). Use create_presentation instead to have the server narrate.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
slugNoURL slug; defaults to a slugified title.
audioNoOne entry per slide you synthesized, from the JSON `bisque-voice` prints on stdout. `words`, `durationMs`, `size` and `hash` map across verbatim. Optional: omit a slide (or the whole array) and its audio carries forward from the previous publish if the narration text is unchanged — otherwise that slide publishes silent and is listed in `staleSlides`. A FIRST publish with nothing to carry forward is rejected.
titleNoDisplay title for the watch page and listings. Omit to use the title parsed from the document.
assetsNoFiles the document references relative to itself — fonts, images, SVG, Lottie, Rive, bundled audio cues. html-presentation/v1 requires these to be self-hosted, so a presentation that renders locally is broken once published unless they travel with it. Each gets an upload URL back alongside the MP3s; PUT them the same way. Paths must be under `assets/` — the server owns index.html, presentation.json and context.md, and the manifest owns audio/. Omit for a presentation that references nothing.
handleNoPublish under a specific channel handle you own.
voiceIdNoRecords what actually spoke, e.g. kokoro:af_heart for a locally synthesized Kokoro voice. No audio is generated server-side.
designMdNoDesign frontmatter mapped to theme tokens.
contextMdNoShared-with-viewer context.md.
indexHtmlYesFull html-presentation/v1 document (the presentation-format meta gate applies).
visibilityNounlisted (the default) is shareable by link and plays in chat-embedded players; private requires the owner to sign in, so an inline chat player shows a sign-in wall instead of playing — choose private only when the user asked for it.unlisted
speechSpeedNoMust match the speed you synthesized at — it is part of the audio cache key, so changing it on a re-publish makes every slide stale instead of carrying forward.
presentationIdNoStable id for idempotent re-publishes; defaults to slug-<hash(userId:slug)>.
voiceStabilityNoRecords the stability setting you synthesized at. No audio is generated server-side.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
filesYesEcho back verbatim as the complete call's `files`.
reusedYesSlide keys whose audio carried forward — no upload.
webUrlYesShareable watch URL.
warningsYes
publishIdYes
uploadUrlsYesOne pre-signed PUT per file to upload.
completeUrlYesPOST here after every PUT, echoing `files` back verbatim.
staleSlidesYesNarrated slide keys that will publish SILENT — synthesize exactly these and publish again.
synthesizedYesSlide keys this request supplied audio for.
presentationIdYes

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed2 schema fields changed
    • addedInput schema / properties / title / description
      Added value: +"Display title for the watch page and listings. Omit to use the title parsed from the document."
    • addedInput schema / properties / voiceStability / description
      Added value: +"Records the stability setting you synthesized at. No audio is generated server-side."
  2. First observed

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark the tool as destructive and not read-only; the description adds real behavioral context: the server assembles presentation.json, returns per-MP3 upload URLs, requires subsequent PUT/POST calls, and reports reused/synthesized/staleSlides. It stops short of explicitly describing overwrite or deletion semantics, but the destructiveHint annotation already signals that side-effect profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but well structured: it front-loads the core action, uses a clear RE-PUBLISHING break for the complex re-publish behavior, and ends with sibling routing. Every sentence contributes either selection criteria, protocol steps, or edge-case handling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter publish tool with a rich schema and an output schema, the description supplies the missing procedural glue: what to send, what to expect back, what to do next, when audio is optional, and the first-publish rejection edge case. An agent has enough context to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 13 parameters thoroughly. The description adds high-level workflow context around audio reuse and stale slides, but it does not need to restate individual parameter meanings. The baseline 3 applies because the schema carries the parameter documentation burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Publish an html-presentation/v1 document using audio YOU synthesized locally.' It also distinguishes itself from the sibling by ending with 'Use create_presentation instead to have the server narrate,' so an agent can clearly tell when this tool is the right choice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly defines the condition for using this tool (locally synthesized narration) and names the alternative (create_presentation for server narration). It also explains when re-publishing can omit audio entirely, giving clear situational guidance beyond the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.1/5.0
Disambiguation4/5

Tools are grouped into clear resource families (artifacts, artifact threads, presentations, channels) and descriptions explicitly redirect between create_artifact and create_presentation. The main potential confusion is create_presentation vs publish_narrated_presentation, since both produce presentations but differ in narration source; the descriptions do clarify this.

Naming Consistency5/5

All tools use snake_case verb_noun naming with consistent families like get_artifact, get_artifact_thread, and get_presentation_spec. publish_narrated_presentation is longer but still follows the verb_noun pattern, and there are no mixed casing styles or erratic naming conventions.

Tool Count4/5

19 tools is above the typical 3-15 range, but the count is justified by four clear subdomains: artifacts, artifact threads, presentations, and channels. No tools are redundant, though the set is large enough to feel slightly heavy.

Completeness4/5

Artifacts have full CRUD plus sharing, and threads have create/read/list/reply/resolve. Presentations cover authoring spec, creation/publishing, status, analytics, and reading context, but there is no delete or explicit update endpoint for presentations and no exposed way to fetch mentionables; these are workable gaps rather than fatal ones.

Resources