{"server":{"name":"vixdeo","title":"Vixdeo","version":"rc.426","websiteUrl":"https://vixdeo.com","protocolVersion":"2025-06-18","endpoint":"https://vixdeo.com/v1/mcp"},"count":22,"readOnlyCount":10,"tools":[{"name":"list_ops","title":"List edit ops","description":"List the unified op vocabulary of a Vixdeo project-conversation (creation / transition / edition), the SAME grammar the human director uses by chat. Returns each op's name, lifecycle phase, a one-line summary and which tool runs it (`invocableVia`), plus the edition-op parameter schema and `visualTypes` — the palette of visual sources a scene can use (`set_visual.visual_type`), with relative cost. `compact=true` omits the parameter schema and the notes; `locale` selects the language of the readable strings (default `en`; `es` adds the Spanish mirrors). $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":true,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"phase":{"type":"string","enum":["creation","transition","edition"],"description":"Optional: only ops of this lifecycle phase."},"locale":{"type":"string","enum":["en","es"],"description":"Language of the readable strings. Default `en` (English only); `es` adds the Spanish mirrors (`nameEs`, `toneSignatureEs`, `summaryEs`)."},"compact":{"type":"boolean","description":"Default false. True omits the heavy, rarely needed parts (parameter schemas, curves, measures, notes) and keeps ids, names and one-line meanings."}},"required":[]}},{"name":"list_referents","title":"List formats","description":"List the creative referents — the formats/styles a piece can be produced in (documentary, explainer, viral short, critical essay…): id, name, what it is for, narrator modality, pacing curve, the format's own defaults (or null when the platform default applies — see `platformDefaults`), and whether the format requires an explicit spend confirmation. The referent id is the `creative_referent` of `generate_script` and `estimate`. Also returns the duration profiles, output formats and budget tiers you can pass in `production`, and the `writingProfiles` catalogue (how the script gets written, with the measured cost/time ratio per format when there is data). `locale` selects the language of the readable strings (default `en`; `es` adds the Spanish mirrors); `compact=true` omits the pacing curve, the per-format writing measures and the writing catalogue. $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":true,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"locale":{"type":"string","enum":["en","es"],"description":"Language of the readable strings. Default `en` (English only); `es` adds the Spanish mirrors (`nameEs`, `toneSignatureEs`, `summaryEs`)."},"compact":{"type":"boolean","description":"Default false. True omits the heavy, rarely needed parts (parameter schemas, curves, measures, notes) and keeps ids, names and one-line meanings."}},"required":[]}},{"name":"estimate","title":"Estimate cost","description":"What this piece would cost and whether it can launch, BEFORE spending — the same verdict the human cockpit shows. Takes the same arguments as `generate_script` (idea, format, `source`, `cast`, `production`). $0, no LLM.\nThe answer has two parts: `launch.ready` says whether the REQUEST is complete and allowed (`launch.blockers` names what is missing); `economics` says what it costs and whether the wallet governs it: `estimateUsd` (typical) with `estimateMinUsd`/`estimateMaxUsd` (a band, not a quote — production charges what it actually spends), `walletBalanceUsd`, and `reason`, one of: `guard_inactivo` — billing is not active in this environment: no wallet governs the launch. · `saldo_desconocido` — the wallet balance could not be read; nothing is inferred from that. · `pedido_sin_cotizar` — not enough to price yet: the request needs an idea (`prompt_seed` or `source`) and a `duration_profile` (or the platform default). · `alcanza` — the wallet covers the estimated band. · `casa_invita` — first piece of this account: it is on the house; the band is informational. · `excede_bienvenida` — first piece of this account, but this request exceeds the welcome allowance: adapt it (`exits`: shorter, no presenter). · `operador_de_la_casa` — this credential belongs to a platform operator: production is not charged to this wallet; the band is informational. · `no_alcanza` — the wallet does not cover the estimated band; `exits` lists what fits (shorter profile, no presenter, top up). `economics.applies` is true only when the wallet does not cover the request; `estimateMaxUsd` against `walletBalanceUsd` is what decides whether a real wallet covers the piece; `hint` restates the reason in words. WHERE THE LINE STOPS FOR FUNDS: the script (first station) is written and charged BEFORE any wallet check; the first station that checks the wallet is the studio build, then the final render — if the wallet does not cover a station the line stops there (`get_project_status.waitingForFunds` names the station and the shortfall) and what was already produced stays paid. `vocabulary` in the answer glosses every typed value that is not English.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":true,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"prompt_seed":{"type":"string","description":"The idea (same as generate_script). Optional here: without an idea or a `source` the verdict says `no_idea` and there is no price yet."},"creative_referent":{"type":"string","description":"Referent id from `list_referents`."},"target_language":{"type":"string"},"source":{"type":"object","description":"Your OWN material. `kind=script` + `respect=strict`: the piece narrates your text verbatim (you keep word-level control from the start); `kind=content`: an article/notes the Director adapts (`respect` guided|adaptive). Omit to let the Director write from `prompt_seed`.","properties":{"kind":{"type":"string","enum":["script","content"]},"respect":{"type":"string","enum":["strict","guided","adaptive"]},"text":{"type":"string"},"title":{"type":"string"}},"required":["text"]},"cast":{"type":"object","description":"As in generate_script. A presenter on screen (`face`, `on_camera` or `describe_face`) moves the price.","properties":{"voice":{"type":"string","description":"Voice `id` or `@handle` from `list_cast`."},"face":{"type":"string","description":"Presenter `id` or `@handle` from `list_cast`."},"on_camera":{"type":"boolean"},"describe_face":{"type":"object","description":"The presenter you want, in words, when no catalogue handle fits. Casting resolves it against the catalogue and may generate.","properties":{"gender":{"type":"string","description":"masculine | feminine | neutral"},"age":{"type":"string","description":"e.g. young_adult, adult, middle_aged, senior"},"ethnicity":{"type":"string"},"hair_color":{"type":"string"},"hair_style":{"type":"string"},"features":{"type":"string","description":"Distinctive traits, free text."},"look":{"type":"string","description":"Overall physical description, free text."}}}}},"production":{"type":"object","properties":{"budget_tier":{"type":"string","enum":["economy","standard","premium"]},"duration_profile":{"type":"string","enum":["short_discovery","short_deep","watch_bridge","watch_standard","longform_monetizable","longform_feature","feature_documentary"],"description":"Omit to price the platform default (`list_referents.platformDefaults.durationProfile`)."},"writing_profile":{"type":"string","enum":["estandar","economico","base"]},"output_format":{"type":"string","enum":["landscape","portrait","square"]},"target_duration_sec":{"type":"number"}}}},"required":["creative_referent"]}},{"name":"list_cast","title":"List voices and presenters","description":"The voices and presenters (faces) that can be named in a piece RIGHT NOW: the organization's own plus the curated platform catalogue, each with a stable `id`, a readable `@handle` and attributes (voices: language, accent, gender; presenters: gender, age, ethnicity, framing) — the `id` or the handle is what `generate_script.cast.voice` / `.face` accept (the id is the key; the handle is a label). Voices whose handle is shared by several distinct voices come with `handle: null` and can only be pinned by `id` (`ambiguousHandles` lists those handles). `generate_script.cast.describe_face` accepts a description when no presenter fits. `language` (BCP-47 prefix), `gender` and `q` filter the catalogue (100+ voices, 50+ presenters). `scope` says whether each one is yours (`mine`) or from the platform catalogue (`platform`). $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":true,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"language":{"type":"string","description":"BCP-47 prefix filter, e.g. `es` (matches es-MX, es-ES…) or `en-GB`."},"gender":{"type":"string","description":"Filter by apparent gender as catalogued (e.g. `male`, `female`)."},"q":{"type":"string","description":"Substring on name, accent or style."},"limit":{"type":"integer","description":"Max voices returned (default 40, max 200)."}},"required":[]}},{"name":"list_projects","title":"List projects","description":"List the projects in the caller's organization (id, title, status, creative referent, updatedAt), newest first. `status` (one of the `statuses` the answer glosses, e.g. EDITORIAL_BLOCKED, STUDIO_READY, FINAL_REVIEW, PUBLISHED) and `q` (substring of the title) filter the list (100+ projects). Archived projects are hidden by design (they are closed for work). $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":true,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"status":{"type":"string","description":"Exact project status to keep."},"q":{"type":"string","description":"Case-insensitive substring of the title."},"limit":{"type":"integer","description":"Max projects (default 50, max 200)."}},"required":[]}},{"name":"get_project_vbp","title":"Read Video Blueprint","description":"Read a project's current Video Blueprint (the structured score of scenes the conversation has produced) plus `cast.voicePin`: the voice named at creation (`generate_script.cast.voice`), the row it names, which rows narrate each scene and whether the pin was honored. Org-isolated: a project outside the caller's organization is not found. $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":true,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"The project id."}},"required":["project_id"]}},{"name":"run_op","title":"Stage an edit op","description":"EDITION ops only (`list_ops.invocableVia` says which tool runs each op; creation fields travel in `generate_script`). Stages ONE edit op on a project — the SAME op the human director runs from a panel or the chat — into the project's conversation draft (agent and human edits converge on ONE op-log); `commit` turns the draft into a new version.\nOps and args:\n- `set_scene_fields` args: scene_index, fields (partial scene object: narrator_text, direction_notes, pre_silence_sec, pause_after_sec, visual.duration_target_sec, visual.prompt, infographic.data, kinetic_caption…; nested dicts merge by key, null deletes; validated by the VBP schema).\n- `set_piece_fields` args: fields (partial production_score: silence_plan, music_intent, narrative_arc, expected_total_duration_sec…; lists replace).\n- `set_visual` args: scene_index, visual_type?, visual_prompt?.\n- `rewrite_scene` args: scene_index, brief (re-authors the WHOLE scene under your brief).\n- `tighten_hook` args: brief? (scene 0).\n- `replan_scenes` args: order=[int...].\n- `swap_voice` args: voice_spec={...} (semantic attributes only: timbre, cadence, accent, language, apparent_gender, voice_style — NOT a voice id: a concrete voice is a piece-level decision made at creation with `generate_script.cast.voice`; the scene has no per-scene voice pin, for the human either), scene_index?.\nCatalog: `replan_scenes` (deterministic, $0): Reorder the scenes (a permutation of indexes). Deterministic, $0. · `rewrite_scene` (LLM, charged like a chat turn): Re-author one scene (script and visual) under your brief. LLM. · `set_piece_fields` (deterministic, $0): Set PIECE-level fields (production_score: silence_plan, music_intent, narrative_arc…), validated by the schema. Deterministic, $0. · `set_scene_fields` (deterministic, $0): Set concrete fields of one scene (narration, duration, silences, infographic data…), validated by the schema. Deterministic, $0. · `set_visual` (deterministic, $0): Set a scene's visual type and/or visual prompt. Deterministic, $0. · `swap_voice` (deterministic, $0): Change the voice (semantic attributes) of one scene or all of them. Deterministic, $0. · `tighten_hook` (LLM, charged like a chat turn): Strengthen the opening hook (scene 0). LLM.\nRequires the `write` scope. The result carries the coherence report: a `hasBlocking` draft can still be committed with `force=true`.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"readOnly":false,"destructive":false,"spendsBudget":true,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"op":{"type":"string","enum":["replan_scenes","rewrite_scene","set_piece_fields","set_scene_fields","set_visual","swap_voice","tighten_hook"]},"args":{"type":"object","description":"Op arguments (see description)."}},"required":["project_id","op","args"]}},{"name":"direct","title":"Direct the piece","description":"A natural-language instruction to the project's Director — the SAME chat turn the human director types: the planner reads your instruction, picks the ops (rewrite_scene / set_scene_fields / set_visual / swap_voice / replan_scenes / tighten_hook), applies them to the staged draft and returns the preview with the coherence report. Suited to an editorial change that spans several fields or scenes («make scene 3 quote the source verbatim and shorten the closing»); `run_op` is the deterministic route for an exact op. Spends LLM budget (charged like a chat turn). Requires `write`. `commit` turns the draft into a version.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"readOnly":false,"destructive":false,"spendsBudget":true,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"message":{"type":"string","description":"Your instruction to the Director, in any language."},"active_scene_index":{"type":"integer","description":"Optional: the scene your instruction refers to (0-based)."},"quality":{"type":"boolean","description":"Reasoned authoring pass (slower, better). Default false."}},"required":["project_id","message"]}},{"name":"commit","title":"Commit a version","description":"Commits the project's staged conversation draft as a new version and makes it THE CUT the production line renders (`isHead: true` in the answer). Re-validates coherence (the same blocking/non-blocking report the human sees); `force=true` overrides a blocking report; `as_branch=true` keeps it as a branch instead (`list_versions` shows branches; `set_head` makes one the cut later). Requires `write`. $0.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"readOnly":false,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"force":{"type":"boolean","description":"Override a blocking-coherence gate."},"as_branch":{"type":"boolean","description":"Keep the commit as a navigable branch INSTEAD of making it the cut the line renders. Default false: a commit is the cut."}},"required":["project_id"]}},{"name":"generate_script","title":"Create a project","description":"SPENDS the organization's wallet by default: with `production.auto_produce=true` (the default) the whole production line runs without further calls. `estimate` prices the same request at $0. The script (first station) is written and charged BEFORE any wallet check; the studio build and the final render check the wallet and stop the line with `waitingForFunds` if it does not cover them — the script stays paid. Creates a NEW project from an idea and launches it — the creation→edition crossing (a project is a conversation that starts from an idea). By default the SAME production line the human's button runs takes the piece all the way to the final video without further calls: script → studio build → final render (never publishes). Spends budget, gated by the org's quota and wallet (§6, same as the human). Returns the project id, the job id and the cast as pinned (`cast.voice` / `cast.face` with `id` and `@handle`); `get_project_status` reports progress until `finalVideoUrl` is set (typically 20-60 min). With `auto_produce=false` the line stops after the script, for edits with `run_op`/`commit` before `produce`. Requires `write`.\n`creative_referent`: a referent id from `list_referents`. Premium formats (`requiresSpendConfirmation`) also need `production.confirm_spend=true`.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"readOnly":false,"destructive":false,"spendsBudget":true,"inputSchema":{"type":"object","properties":{"prompt_seed":{"type":"string","description":"The idea, in your own words (topic, angle, what the viewer should take away)."},"creative_referent":{"type":"string","description":"The format/style referent id (see `list_referents`)."},"title":{"type":"string","description":"Optional project title (else derived from the idea)."},"target_language":{"type":"string","description":"ISO-639-1 of the piece (en, es, pt, …). Default en."},"source":{"type":"object","description":"Your OWN material. `kind=script` + `respect=strict`: the piece narrates your text verbatim (you keep word-level control from the start); `kind=content`: an article/notes the Director adapts (`respect` guided|adaptive). Omit to let the Director write from `prompt_seed`.","properties":{"kind":{"type":"string","enum":["script","content"]},"respect":{"type":"string","enum":["strict","guided","adaptive"]},"text":{"type":"string"},"title":{"type":"string"}},"required":["text"]},"cast":{"type":"object","description":"Who narrates and who appears. THREE ways, and you can mix them: (a) name someone from `list_cast` by `id` or `@handle` (`voice` / `face`) — a name that does not resolve is an error, never a silent fallback; (b) DESCRIBE the presenter you want in `describe_face` and casting picks the closest face from the catalogue — with enough detail (features, or two of gender/age/ethnicity) it can GENERATE a new one for this piece, which costs money and needs `production.confirm_spend=true`; (c) say nothing and the casting decides by ear. `on_camera` puts the presenter on screen. A named `face` wins over `describe_face`.","properties":{"voice":{"type":"string","description":"Voice `id` or `@handle` from `list_cast`."},"face":{"type":"string","description":"Presenter `id` or `@handle` from `list_cast`."},"on_camera":{"type":"boolean"},"describe_face":{"type":"object","description":"The presenter you want, in words, when no catalogue handle fits. Casting resolves it against the catalogue and may generate.","properties":{"gender":{"type":"string","description":"masculine | feminine | neutral"},"age":{"type":"string","description":"e.g. young_adult, adult, middle_aged, senior"},"ethnicity":{"type":"string"},"hair_color":{"type":"string"},"hair_style":{"type":"string"},"features":{"type":"string","description":"Distinctive traits, free text."},"look":{"type":"string","description":"Overall physical description, free text."}}}},"required":[]},"production":{"type":"object","description":"How to produce it. Omit for the platform defaults.","properties":{"auto_produce":{"type":"boolean","description":"Run the whole line to the final video (default true)."},"budget_tier":{"type":"string","enum":["economy","standard","premium"],"description":"Material budget: economy | standard | premium (premium unlocks generated video)."},"duration_profile":{"type":"string","enum":["short_discovery","short_deep","watch_bridge","watch_standard","longform_monetizable","longform_feature","feature_documentary"],"description":"Target length profile (see `list_referents.durationProfiles` for seconds)."},"output_format":{"type":"string","enum":["landscape","portrait","square"],"description":"landscape (16:9) | portrait (9:16) | square (1:1)."},"writing_profile":{"type":"string","enum":["estandar","economico","base"],"description":"How the script is written — see `list_referents.writingProfiles` for each profile's meaning and the measured cost/time ratio per format. Default `estandar`."},"target_duration_sec":{"type":"number","description":"Exact target length in seconds, inside the duration_profile's range (e.g. 300 for «five minutes» in watch_standard). Without it the profile's own target governs."},"confirm_spend":{"type":"boolean","description":"Required true for formats that declare `requiresSpendConfirmation`."}},"required":[]}},"required":["prompt_seed","creative_referent"]}},{"name":"get_project_status","title":"Get project status","description":"Where a project stands: lifecycle status, production drive (auto | manual | none), whether the line is waiting on funds, the cut (`headVersionId`, `latestVersion`), the runs (script / build / final / publish) with status and cost, `publication` (whether the piece is published and whether the cut changed since), and — when delivered — `finalVideoUrl`. `latestRunByKind` is a compact index by run kind; the full objects live in `runs`. `next` names the following step. The server pushes no notifications: progress is visible only through a new call. $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":true,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"}},"required":["project_id"]}},{"name":"judge_script","title":"Judge the script","description":"The house critic's judgement of a script version — the same independent critic the writing pipeline uses, reading the deterministic quality report alongside. Returns scores 0-100 (global, fidelity to the material, channel voice, rhythm), per-scene notes with severity, and the quality report. Judgement only: it never rewrites. Spends one critic call (small, seconds). The verdict is kept on the version. Defaults to the head version. Requires `write`.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"readOnly":false,"destructive":false,"spendsBudget":true,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"version_id":{"type":"string","description":"Optional: a specific version; default the project's head."}},"required":["project_id"]}},{"name":"rewrite_script","title":"Rewrite the script","description":"Rewrites the WHOLE piece under the brief with the format's writer (the same revision pass the writing pipeline runs), then re-dress only the scenes whose narration changed (visuals are kept). `run_op rewrite_scene` covers ONE scene; this covers a brief that spans the piece («more rhythm in the second act, and let the ending return to the thesis»). Asynchronous: returns a run id; `get_project_status` (`latestRunByKind.editorial_rewrite`) carries the new version id in `editorialVersionId` when DONE. `as_branch=false` (default) makes the result THE CUT the line renders, like `commit`. Spends LLM budget: a full script pass, priced like the writing profile of the piece (`list_referents.writingProfiles[].measure`). Writers that require spend confirmation need `confirm_spend=true`. Requires `write`.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"readOnly":false,"destructive":false,"spendsBudget":true,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"brief":{"type":"string","description":"What to change, in any language (max 4000 chars)."},"version_id":{"type":"string","description":"Optional: the base version; default the project's head."},"as_branch":{"type":"boolean","description":"Keep the rewrite as a branch instead of making it the cut. Default false."},"confirm_spend":{"type":"boolean","description":"Required when the piece's pen requires spend confirmation (see `list_referents.requiresSpendConfirmation`)."}},"required":["project_id","brief"]}},{"name":"produce","title":"Produce the video","description":"Starts (or resumes) the production line of an EXISTING project: sets its drive to auto and dispatches the next station — the same sequence the human's «produce» button runs (enrich → studio build → final render). It never publishes. Applies to a project created with `auto_produce=false` once edited with `run_op`/`commit`, and to a line that stopped. Spends budget under the org's quota. Requires `write`.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"readOnly":false,"destructive":false,"spendsBudget":true,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"}},"required":["project_id"]}},{"name":"cancel","title":"Stop the production line","description":"Stops a project's production: the line stops taking stations (drive → manual) and every run still alive (script, build, final render) is marked cancelled. Honest limits, declared in the answer: a worker already inside a step may finish that step (its artifacts are kept and reused), money already spent is spent, and nothing is deleted — `produce` resumes later from what exists. Idempotent. Requires `write`. $0.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"readOnly":false,"destructive":true,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"reason":{"type":"string","description":"Optional: why (kept on the cancelled runs)."}},"required":["project_id"]}},{"name":"list_versions","title":"List versions","description":"The project's version timeline (newest first) with lineage: id, number, `sequence` (global position in the timeline, never repeats), parent, origin (script generation, agent/human commit, rewrite…), branch label, status, scene count, and `isHead` — the cut the line renders. Version `status` vocabulary: `working` = the operable cut · `approved` = script approved by the editorial gate · `draft` = a branch not promoted · `superseded`/`discarded` = replaced as the cut (kept in history) · `rewrite` = produced by a rewrite run. `set_head` makes another version the cut. $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":true,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"limit":{"type":"integer","description":"Max versions (default 20, max 100)."}},"required":["project_id"]}},{"name":"set_head","title":"Make a version the cut","description":"Makes an existing version THE CUT the production line renders — the same act as the human's «restore» on the version timeline and as `commit` without `as_branch`. Non-destructive: the previous cut stays in history (`superseded`); `produce` renders it afterwards. Requires `write`. $0.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":false,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"version_id":{"type":"string","description":"A version id from `list_versions`."}},"required":["project_id","version_id"]}},{"name":"whoami","title":"Who am I","description":"The principal behind this credential: credential kind and scopes (`read` lets you look, `write` lets you create/edit/produce), the organization (id, name, default locale), the user the work is attributed to, whether that user operates the platform (then production is not charged to the wallet), the wallet balance in USD, the first-piece offer in force, and the server version. $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":true,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"request_upload","title":"Request upload ticket","description":"A short-lived upload ticket for the creator's OWN material (a recorded interview, a product photo, drone footage) so it can be placed in a scene. Returns `upload` (PUT the raw file bytes to `url` with exactly the `headers` given) and a `handle`; the bytes never travel through this tool. With `size_bytes` the size is part of the signature. `complete_upload` registers the upload by that handle. Accepted: png/jpg/jpeg/webp/gif images and mp4/mov/webm video, up to 200 MB. $0.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"readOnly":false,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"filename":{"type":"string","description":"Original filename with extension (decides image vs video)."},"content_type":{"type":"string","description":"Optional MIME type; must match the extension."},"size_bytes":{"type":"integer","description":"Optional size, checked against the cap before issuing the ticket."}},"required":["filename"]}},{"name":"complete_upload","title":"Register uploaded material","description":"Confirms an upload finished and registers it in the creator's personal library. Verifies the object exists and is media, identifies it by content (the same file twice is one asset) and stores `declared_content` — WHAT the material shows (≤240 chars), which is what lets a director place it on the right scene. Returns `assetId` for `assign_material`. $0.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":false,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"handle":{"type":"string","description":"The `handle` from `request_upload`."},"declared_content":{"type":"string","description":"What the material shows, e.g. 'Interview with the harbour master, 2024, dock in background'."}},"required":["handle"]}},{"name":"list_material","title":"List own material","description":"The creator's own material already in the library (assetId, kind, what it declares). $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"readOnly":true,"destructive":false,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"limit":{"type":"integer"}},"required":[]}},{"name":"assign_material","title":"Assign material to a scene","description":"Puts a library asset (own material from `complete_upload`, or any asset the org can see) as the visual of ONE scene — the same act as the human's «Mi Media» in the Studio. `scene_index` is 0-based like the VBP. For video, `clip` {start_sec, duration_sec|end_sec} selects the segment (≥2 s); images take no clip. Applies to the Studio version directly (no `commit` needed); the render picks it up on the next `produce`. Requires `write`. $0.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"readOnly":false,"destructive":true,"spendsBudget":false,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"scene_index":{"type":"integer","description":"0-based scene index (as in `get_project_vbp`)."},"asset_id":{"type":"string","description":"`assetId` from `complete_upload` / `list_material`."},"clip":{"type":"object","properties":{"start_sec":{"type":"number"},"duration_sec":{"type":"number"},"end_sec":{"type":"number"}}},"shows":{"type":"string","description":"Optional: why this material fits this scene (kept with the assignment)."}},"required":["project_id","scene_index","asset_id"]}}],"note":"The same catalogue `tools/list` returns over MCP, published without credentials so the contract can be audited (annotations included). Calling any tool still needs a credential."}