Zyng MCP client — record your running app with an agent, publish a managed narrated pitch.
Project description
zyng-mcp
Record a running app with your coding agent, get back a managed, narrated pitch video — without ever recording it yourself.
Point your agent (Claude Desktop, Claude Code, or any MCP client) at your localhost app. It authors the steps from the source it just wrote; this server drives the app headless with Playwright, screen-records each feature keyless and free, then publishes the clips + your narration context to hosted Zyng (https://app.zyng.work), which stitches and narrates the pitch server-side on your credits and hands back an MP4. No TTS key ever leaves your machine — the data→video engine stays managed.
Tools
| tool | what it does | needs |
|---|---|---|
account |
your Zyng credit balance (the "do I have credits?" check) | API token |
capture_clips |
drive a running app headless, screen-record a feature into a raw clip + timeline | Chromium, no key |
publish |
upload clips + a composition spec → a managed narrated stitch, downloaded as MP4 | API token, spends credits |
Install
pipx install zyng-mcp # or: pip install ./zyng_mcp-0.1.0-py3-none-any.whl
python -m playwright install chromium # one-time browser download (~150MB)
capture_clips needs Chromium; publish does not (the render happens on Zyng). No ffmpeg required.
Get an API token
- Sign in at https://app.zyng.work (Google).
- Avatar menu → API tokens → Mint, and copy the
zyk_…token (shown once).
A fresh account includes free credits; 1 credit = 1 second of finished video.
Recording apps that need a login
Never put a password in a capture spec — it would land in the agent's context, the tool-call logs, and (if typed on screen) the uploaded video. Three on-machine options instead, all resolved locally so the credential never reaches the agent or Zyng:
HTTP Basic Auth (the browser's WWW-Authenticate dialog — e.g. a staging site):
zyng-mcp secret set staging_basic_auth # hidden prompt; enter: username:password
Then pass the secret's name to capture (the agent never sees the value):
{ "do": "capture_clips", "http_auth": "staging_basic_auth" }
Playwright answers the challenge at the network layer — no dialog, nothing on screen, authenticated:true.
Preferred — a saved session (nothing is typed or recorded):
zyng-mcp login http://localhost:3000 # opens a browser; log in by hand, press Enter to save
This writes the authenticated session to ~/.zyng/state/<host>.json (chmod 600). capture_clips
auto-detects it for that host, so recordings start already signed in — the result shows
"authenticated": true. No login step, no password on screen.
If you must demonstrate the login itself — a named secret (the agent only sees the name):
zyng-mcp secret set acme_password # hidden prompt; stored in the OS keychain or a chmod-600 file
Then a step references it by name (never the value):
{ "do": "fill", "selector": "#password", "secret": "acme_password" }
The value is resolved at capture time and never enters the spec, the tool call, a log, or the result.
Keychain storage needs pipx install "zyng-mcp[keychain]"; otherwise it falls back to
~/.zyng/secrets.json (chmod 600). You can also pass a secret as an env var, e.g.
ZYNG_SECRET_ACME_PASSWORD.
Anything visible on screen during capture ends up in the uploaded MP4 — prefer the saved session for anything sensitive, and use a throwaway/test account where you can.
Register with your agent
Add to claude_desktop_config.json (Claude Desktop) or .mcp.json (Claude Code):
{
"mcpServers": {
"zyng": {
"command": "zyng-mcp",
"env": {
"ZYNG_API_KEY": "zyk_your_token_here",
"ZYNG_BASE_URL": "https://app.zyng.work"
}
}
}
}
(If you installed with pipx, zyng-mcp is on your PATH. With a venv, use the absolute path to the
zyng-mcp script, or command: "python", args: ["-m", "zyng_mcp.server"].)
Use it
Tell your agent something like:
My app is running at http://localhost:3000. Record the sign-in and the dashboard, then publish a 30-second pitch. Say "this is the fastest way to onboard" over the dashboard.
The agent will, in order: check account for credits, call capture_clips once per feature (authoring
the Playwright selectors from your source), assemble a publish spec (title card + clip segments with
your narration), and call publish — blocking until Zyng returns the finished MP4 and the share link.
Spec shapes (the agent fills these)
capture_clips spec:
{ "url": "http://localhost:3000", "title": "Dashboard", "aspect": "16:9",
"steps": [
{ "do": "wait", "ms": 1000, "say": "Here's the dashboard." },
{ "do": "click", "selector": "text=New report", "say": "One click to a new report." }
] }
publish spec (clip files matched by basename to the captured clips you pass in clips):
{ "title": "My app", "theme": "dawn", "voice": "narrator", "aspect": "16:9",
"segments": [
{ "card": { "layout": "title", "heading": "My app", "narration": "A quick tour." } },
{ "clip": { "file": "dashboard.webm", "audio": "narrate", "say": "This is the dashboard." } }
] }
Notes
- Credits + voice are managed. You never ship an ElevenLabs/OpenAI key; Zyng renders with its own voice and charges your balance (gate-at-zero with a clear error).
- Selectors come from your source, not pixel-guessing — Zyng executes the steps your agent authors, so a recording is deterministic and re-runnable. A bad selector returns a clean error naming the step.
- Set
ZYNG_BASE_URLto a different host to target a self-hosted or staging studio.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zyng_mcp-0.6.0-py3-none-any.whl.
File metadata
- Download URL: zyng_mcp-0.6.0-py3-none-any.whl
- Upload date:
- Size: 34.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3aa0194edc549a4c53b593ff0a68651a87722bd7e376c8ce65cf31bf12bf4d27
|
|
| MD5 |
2a359a7e1c87494f2b70f47f615bd26a
|
|
| BLAKE2b-256 |
79b192d8841161ab342d14fe386dfa608556c2f0937e0c4f2d6677f5ccd0761e
|