video-edit
Edit and compose
Which path
- VideoDB connector tools present (names such as
render_timeline,upload_media,download_timeline_render): use them. This is the path in Claude chat on web, desktop and mobile, and in Cowork. Do not install anything and do not ask for an API key. - No VideoDB tools, but you have a shell (Claude Code, Cowork, any agent that can run Python): ask for the VideoDB API key in one friendly line (free at https://console.videodb.io, $20 of credits, no card). When the user gives it, in chat or any other way, save it yourself to the project's
.envasVIDEO_DB_API_KEY, never print it, and continue with the Python SDK path at the end of this file. In Claude Code,/mcpthen authorizing videodb also works. - No VideoDB tools and no shell: you are in Claude chat. Reply with only this, adapted to the request: "VideoDB isn't connected yet. Open Settings → Connectors, find VideoDB, click Connect and log in (free, no card). Then send this request again and I'll take it from there." Do not mention API keys,
.env, shells, Claude Code or/mcphere; none of them apply in chat, and a key pasted into chat cannot be used because nothing runs code there.
Talking to the user: never write "index", "indexed" or "indexing" in a reply. Say "searchable" ("it is now searchable by what was said and what is shown"), and "transcribe" rather than naming a job. One line of status at a time, then the result.
Rendering is a long job: the call returns status: processing. The reply carries an output_url and names the tool to poll (poll_with, or retry_with on older servers). Call that tool with the output_url until it is done; several processing replies in a row are normal (a 10-minute YouTube upload takes about five), and a done reply with an empty result means poll once more. Never re-run the write; that starts a second job. Share the finished player_url.
Do not fall back to ffmpeg, moviepy or local encoding for anything below; it all runs on VideoDB's servers.
With the connector tools
Assets first. Every piece of media needs a VideoDB id: videos m-, audio a-, images img-. upload_media(url) takes a public URL or YouTube link (media_type="audio" for a music file, "image" for a logo). list_videos, list_audios, list_images show what is already there. Local files cannot come through the connector; the user uploads at https://console.videodb.io.
One call composes everything: render_timeline(tracks=[...], resolution="1920x1080", background="#000000"). Each track holds clips; each clip has start (seconds on the timeline), duration, and an asset. Tracks stack by z_index (higher on top).