aidemo
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| OPENAI_API_KEY | No | API key for OpenAI TTS (required if AIDEMO_TTS_PROVIDER is not 'local') | |
| OPENAI_BASE_URL | No | Optional base URL for OpenAI-compatible TTS endpoint (e.g., a local server). | |
| AIDEMO_TTS_PROVIDER | No | TTS provider; set to 'local' to use in-process voice (no API key needed). Default is 'openai' if key is set, else 'local'. |
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": true
} |
| logging | {} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_authoring_guideA | The canonical guide to authoring demos: storyboard schema, action vocabulary, demo-director principles, ChatGPT-app recording facts. Call this FIRST before authoring or editing a storyboard. Pass |
| get_storyboard_schemaA | JSON Schema for storyboard.json, generated from the engine's own zod schema — the exact contract the engine validates against. |
| validate_storyboardA | Validate a storyboard against the engine schema without running anything. Pass exactly one of: dir (uses generated/storyboard.json), path (a storyboard file), or json (storyboard JSON as a string). relaxed makes narration optional (probe semantics). |
| lint_storyboardA | Browser-free preflight over a storyboard: a per-scene pacing forecast (which scenes compose will mostly freeze-hold or cut because the narration and the recorded action don't match), selector/wait pitfalls (type+Enter with no wait, :text-is on nested labels, focus without a zoom block, anchored waitForChange regexes), and no-op keys. Run it after every storyboard edit, before probe/render. Pass exactly one of dir / path / json. lang lints a narrations[lang] translation at that language's speaking rate. |
| init_demoA | Create demos// with a starter brief + storyboard. dir is the repo to scaffold into (absolute path recommended; default: server cwd). With fromUrl the page is inspected first (no LLM): its headings become scenes and its unique selectors become the beats + a |
| doctorA | Check prereqs: node, ffmpeg, Chrome, TTS/STT endpoint (flags LLM-only servers like Ollama), API key, playwright, installed skill. |
| embedA | Ready-to-paste embed snippets (markdown GIF, markdown still, HTML ) for a demo, using stable raw.githubusercontent URLs on the 'demo-media' branch. Pure string generation — no network, no render. Owner/repo come from the repo's origin remote; the demo name from the directory basename. Pair with the demo-publish workflow so CI keeps the URLs fresh. See docs/EMBEDS.md. |
| feedbackA | File a bug, surprise, or workaround you hit this session as a GitHub issue on the aidemo engine repo (github.com/tandryukha/aidemo) — the in-band equivalent of |
| job_statusA | Status, stage, per-scene progress (scenesTotal/scenesDone/currentScene — populated for probe/record/render/voice/captions/compose), log tail, and final result or error (with failure-artifact paths and, on a genuine failure, a feedbackHint pointing at the feedback tool) of a pipeline job. |
| job_listA | All jobs this server session, newest last. |
| job_cancelA | Best-effort cancel (checked between actions/scenes/stages). A mid-record cancel salvages the partial timeline + footage. The job settles asynchronously — poll job_status for the final state. |
| probeA | Record-only dry run to verify selectors/timing (narration optional). With updateGolden, writes golden/probe.json (the regression baseline); with golden, deep-compares against it and returns match + field-level diffs. Returns a jobId immediately — poll job_status. Rejects if another job is running. |
| import_traceA | Turn a Playwright trace.zip (context.tracing / |
| recordA | Drive the storyboard in Chrome and record raw video + timeline.json. Returns a jobId immediately — poll job_status. Rejects if another job is running. |
| renderA | Full pipeline: voice → record → captions → compose (the CLI |
| voiceA | Generate per-scene TTS narration (skips unchanged scenes). Returns a jobId immediately — poll job_status. Rejects if another job is running. |
| captionsA | Transcribe narration.mp3 to captions with word timing. Returns a jobId immediately — poll job_status. Rejects if another job is running. |
| composeA | Trim, sync, mux and caption into output/final-demo.mp4. Returns a jobId immediately — poll job_status. Rejects if another job is running. |
| gifA | Convert output/final-demo.mp4 to a README-ready GIF. Returns a jobId immediately — poll job_status. Rejects if another job is running. |
| stillsA | Extract named stills (screenshot mode) from the recorded take into output/stills/ — one PNG per |
| framesA | Dump evenly spaced PNG frames from the final video (or the raw take) into output/frames/ for review — look at them instead of hand-running |
| walkthroughA | Export output/walkthrough/ from the final video: index.html (one card per scene — payoff frame, title, narration, jump-to-time; ← → keyboard nav), guide.md (README/SOP-ready), per-scene PNGs, SRT/VTT and a JSON manifest. Needs only the rendered video + report.json (no key, no browser). Returns a jobId immediately — poll job_status. Rejects if another job is running. |
| inspectA | Open a URL in the recording profile (logged-in state included) and list every visible interactive element with UNIQUE selectors ranked data-testid → id → aria-label → role/text → name/placeholder → class → path, plus headings and iframes. Use it BEFORE writing targets — no selector guessing, no wasted probe. Writes logs/inspect-.json and a screenshot in the demo dir. Returns a jobId immediately — poll job_status. Rejects if another job is running. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| authoring-guide | Canonical agent-neutral demo-authoring guide |
| storyboard-schema | JSON Schema generated from the engine's zod schema |
TDQS
Scored across 23 tools
Most tools map to distinct pipeline stages or artifacts, and descriptions clearly separate near neighbors like frames vs stills and validate_storyboard vs lint_storyboard. A couple of pairs (record/probe/render, frames/stills) require careful reading, but there is no real functional overlap.
All names are lowercase snake_case, but conventions are mixed: bare verbs (record, probe), output-noun names (frames, stills, gif), get_ prefixes, and job_list/job_status/job_cancel which are not uniformly verb-first. The set is readable but lacks a single consistent verb_noun pattern.
With 23 tools, this sits in the heavy range for an MCP surface even though the demo-pipeline domain is complex. Each tool has a distinct purpose, but the count feels borderline and some consolidation could make it tighter.
The surface covers the full authoring lifecycle: scaffolding, schema/guide, validation/linting, inspection, probe/record, all render stages, stills/frames/gif/walkthrough exports, job management, environment checks, and feedback. There are no obvious dead ends or missing core operations for the stated purpose.