{"server":{"name":"vixdeo","title":"Vixdeo","version":"rc.601","websiteUrl":"https://vixdeo.com","protocolVersion":"2025-06-18","endpoint":"https://vixdeo.com/v1/mcp"},"count":24,"readOnlyCount":10,"tools":[{"name":"list_ops","title":"List edit ops","description":"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 the tool that runs it (`invocableVia`), the edition ops' parameter schema, and `visualTypes`: the visual sources a scene can use (the `visual_type` of `set_visual`), with relative cost. `compact=true` leaves out 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},"effect":"reads","reach":"own_account","annotationsRationale":"Read-only: returns Vixdeo's catalogue of edit operations and visual source types; it creates, changes and spends nothing. Only Vixdeo's own catalogue is involved, no external system.","readOnly":true,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"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":"The creative referents — the formats a piece can be produced in (documentary, explainer, viral short, critical essay…): id, name, purpose, narrator modality, pacing curve, the format's own defaults (null where the platform default applies, listed in `platformDefaults`), and whether the format requires an explicit spend confirmation. The referent id is the value of `creative_referent` when a piece is created or priced. Also returns the duration profiles, output formats and budget tiers that `production` accepts, the `writingProfiles` catalogue (how a script gets written, with the measured cost/time ratio per format when there is data), and `sceneOptions` (who writes the data scenes and their photoreal finish, with the per-scene measure). `locale` selects the language of the readable strings (default `en`; `es` adds the Spanish mirrors); `compact=true` leaves out the pacing curve, the per-format writing measures and the writing catalogue. $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"effect":"reads","reach":"own_account","annotationsRationale":"Read-only: returns Vixdeo's catalogue of formats, duration profiles and writing profiles; it creates, changes and spends nothing. Only Vixdeo's own catalogue is involved, no external system.","readOnly":true,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"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 a piece would cost and whether it can launch, BEFORE anything is spent — the same verdict the human cockpit shows. Accepts the same arguments as project creation (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: the balance does not govern it; the band is informational. · `excede_bienvenida` — first piece of this account, and this request is above what a first piece can be: a shorter duration profile or no presenter fits — price the change with `estimate`. · `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 organization's balance does not cover the estimated band. `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 before the balance is checked and settles with the first render; the first station that checks the balance is the studio build, then the final render — if the balance does not cover a station the line stops there (the project status reports `waitingForFunds` with the station) and what was already produced stays. `vocabulary` in the answer glosses every typed value that is not English.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"effect":"reads","reach":"own_account","annotationsRationale":"Read-only: prices a request against the catalogue and the organization's wallet balance without creating a project or calling any provider ($0). The answer is informational and stays inside the caller's Vixdeo account.","readOnly":true,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"inputSchema":{"type":"object","properties":{"prompt_seed":{"type":"string","description":"The idea (the same field as at creation). Optional here: without an idea or a `source` the verdict says `no_idea` and there is no price yet."},"creative_referent":{"type":"string","description":"A referent id from Vixdeo's catalogue of formats."},"target_language":{"type":"string"},"source":{"type":"object","description":"The creator's OWN material. `kind=script` + `respect=strict`: the piece narrates the text verbatim (word-level control from the start); `kind=content`: an article or notes the Director adapts (`respect` guided|adaptive). Without it the Director writes 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"]},"material":{"type":"array","description":"The creator's own uploaded files that belong to this piece (footage, photos, a recorded voice). Each item names one file of the personal library by its `assetId`: the id alone, or an object with `asset_id` and a `purpose` (what the file is for in the piece). The files are stored with the piece; the answer says what the piece does with them (`direction`), and they are not part of the price. While a file is still being verified, the `handle` of its upload is accepted in place of the id, and the request is answered as not ready; a file that is not in the caller's library is answered as not usable.","items":{"anyOf":[{"type":"string","description":"The `assetId` of a file of the personal library."},{"type":"object","properties":{"asset_id":{"type":"string","description":"The `assetId` of a file of the personal library."},"purpose":{"type":"string","description":"What the file is for in the piece, e.g. 'the interview that closes the piece'."}},"required":["asset_id"]}]}},"cast":{"type":"object","description":"The cast, as at creation. A presenter on screen (`face`, `on_camera` or `describe_face`) moves the price.","properties":{"voice":{"type":"string","description":"A voice `id` or `@handle` from the catalogue of nameable voices."},"face":{"type":"string","description":"A presenter `id` or `@handle` from the catalogue of nameable presenters."},"on_camera":{"type":"boolean"},"describe_face":{"type":"object","description":"The wanted presenter, in words, for when no catalogue handle fits. Casting resolves it against the catalogue and may generate one.","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":"Without it, the platform default is priced (`platformDefaults.durationProfile` in the catalogue of formats)."},"subtitle_language":{"type":"string","description":"Language of the SUBTITLES (BCP-47: `es`, `pt-BR`…), its OWN axis, independent of `target_language`: without it the subtitles follow the piece; with it the piece is narrated in one language and read in another (measured: 21 live projects declare the two on purpose)."},"writing_profile":{"type":"string","enum":["estandar","economico","base"]},"scene_author_profile":{"type":"string","enum":["estandar","premium"],"description":"Who writes the data scenes of a format that writes them (`sceneOptions.appliesTo`): `estandar` is the production author (Claude Opus 5.5 at the usual effort); `premium` is the same model thinking harder (maximum effort, more time and turns per scene; measured at $4.75-5.36 per scene, about 5-6x the standard author, and 26-30 min per scene — `sceneOptions` gives the measure). Without it the budget tier sets it (`estandar` in every tier). Choosing `premium` requires a spend confirmation."},"scene_finish":{"type":"string","enum":["ninguno","seedance"],"description":"Photoreal finish of the data scenes: `seedance` restyles each scene's world into generated footage (text and figures stay Vixdeo's own); `ninguno` ships the scene as drawn. Without it: `ninguno` in every tier. The finish is PAUSED by a product decision (2026-10-20) until a new experiment: while `sceneOptions.sceneFinish[].paused` is true, declaring `seedance` is accepted, buys nothing and resolves to `ninguno` with reason `pausado` (the priced request echoes it as `sceneFinishReason`). When not paused it is honored only where the tier pays for generated video, and choosing it there requires a spend confirmation."},"output_format":{"type":"string","enum":["landscape","portrait","square"]},"target_duration_sec":{"type":"number","description":"Exact target length in seconds (e.g. 210 for «3:30»). It governs the duration profile: if it falls outside the profile's range, the profile whose range contains it governs and the response says so (`durationProfileSource: target_duration_sec`, `durationProfileDisplaced` names the profile it replaced). Without a profile it picks the one that contains it. Without it the profile's own target governs."},"period_rigor":{"type":"string","enum":["note","rebuy"],"description":"What happens when the era check finds an anachronism in a GENERATED shot (a modern helmet in 1906): `note` records it and mounts the shot; `rebuy` buys the shot again ONCE, telling the generator what to leave out, within the piece's recomposition cap. Without it the budget tier decides (premium rebuys; standard and economy note)."}}}},"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 (platform voices: language, accent, gender; platform presenters: gender, age, ethnicity, framing; the organization's own voices and presenters carry name, handle and language or framing only, since they may be real people). The `id` or the handle is how a piece names its voice or presenter at creation (the id is the key; the handle is a label). Voices whose handle is shared by several distinct voices come with `handle: null` and are named only by `id` (`ambiguousHandles` lists those handles). `language` (BCP-47 prefix), `gender` and `q` filter the catalogue (100+ voices, 50+ presenters). `scope` says whether each one belongs to the organization (`mine`) or to the platform catalogue (`platform`). $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"effect":"reads","reach":"own_account","annotationsRationale":"Read-only: lists the voices and presenters the caller's organization can name (its own and the curated platform catalogue); it changes nothing. It stays inside the caller's Vixdeo account.","readOnly":true,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"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":"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":"The projects in the caller's organization (id, title, status, creative referent), ordered by most recent update. `status` (one of the `statuses` the answer glosses, e.g. EDITORIAL_BLOCKED, STUDIO_READY, FINAL_REVIEW, PUBLISHED) and `q` (a substring of the title) filter the list (100+ projects). Archived projects are left out by design (they are closed for work). $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"effect":"reads","reach":"own_account","annotationsRationale":"Read-only: lists the projects of the caller's organization; it changes nothing. It stays inside the caller's Vixdeo account.","readOnly":true,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"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":"The Video Blueprint of a project's CUT — the version that edits change and the production line renders (the structured score of scenes) — plus `cast.voicePin`: the voice named when the piece was created, the row it names, which rows narrate each scene and whether the pin was honored. Paged so every answer fits the size a host accepts for one tool result: without `scene_from` the answer carries the piece-level fields and as many scenes as fit, from scene 0; with `scene_from` (and optionally `scene_count`) it carries only that window of scenes. `page` says where the page starts, how many scenes the piece has, `nextSceneFrom` (null on the last page) and whether the answer holds the whole blueprint (`complete`). Scene positions are 0-based, the same positions the edit ops take, and so is every reference to a scene inside the blueprint (score, chapters, colour, thumbnail): `sceneReferences` states the base and, per group, whether those references were verified. Each scene's `factual_backing.artefactos` lists the researched facts the scene cites, each with its `id` in the piece's material (`A7` a fact, `N3` an anecdote), its source and URL; `pantalla` says whether a screen is `documentada`, `reconstruida` (labelled) or `retenida` (content absent from the declared sources was withheld). A scene's `duration_target_sec` is the window written before the voice exists: the render fits each scene to its narration, so those windows add up to more than the delivered video, whose measured length the project status reports as `finalVideoDurationSec`. Each page also carries `fidelity`: the per-scene rows of the project status's `fidelityReport` for the scenes of that page. Org-isolated: a project outside the caller's organization is not found. $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"effect":"reads","reach":"own_account","annotationsRationale":"Read-only: returns a project's scene blueprint, one page of scenes at a time; it changes nothing. It stays inside the caller's Vixdeo account.","readOnly":true,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"The project id."},"scene_from":{"type":"integer","description":"0-based position of the first scene of the page (`page.nextSceneFrom` of the previous answer). Without it the answer is the first page, which also carries the piece-level fields."},"scene_count":{"type":"integer","description":"Optional: at most this many scenes. The page may carry fewer when they would not fit in one result."}},"required":["project_id"]}},{"name":"stage_op","title":"Stage a free edit op","description":"Stages ONE free edit op on a project — deterministic, no provider is called — into the project's conversation draft: the SAME op the human director runs from a panel or the chat (agent and human edits converge on ONE op-log). The draft becomes a new version when it is committed. Only the free ops run here: the paid re-authoring ops and the creation fields have their own tools (`invocableVia` in the op catalogue names the tool of each op).\nOps:\n- `replan_scenes`: Reorder the scenes (a permutation of indexes). Deterministic, $0. Args: order=[int...].\n- `set_piece_fields`: Set PIECE-level fields (production_score: silence_plan, music_intent, narrative_arc…), validated by the schema. Deterministic, $0. Args: fields (partial production_score: silence_plan, music_intent, narrative_arc, expected_total_duration_sec…; lists replace).\n- `set_scene_fields`: Set concrete fields of one scene (narration, duration, silences, infographic data…), validated by the schema. Deterministic, $0. 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_visual`: Set a scene's visual type and/or visual prompt. Deterministic, $0. Args: scene_index, visual_type?, visual_prompt?.\n- `swap_voice`: Change the voice (semantic attributes) of one scene or all of them. Deterministic, $0. Args: voice_spec={...} (semantic attributes only: timbre, cadence, accent, language, apparent_gender, voice_style — NOT a voice id: the concrete voice is a piece-level decision made when the piece is created; a scene has no voice pin of its own, for the human either), scene_index?.\nThe result carries the coherence report: a `hasBlocking` draft can still be committed with `force=true`. While an authoring turn of the same project is in flight the draft is not touched (`authoring-in-progress`). Requires the `write` scope. $0.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Stages one free, deterministic edit into the project's draft (nothing changes until the draft is committed, which keeps the previous version in the history); it calls no provider and charges nothing, so it is not destructive. Not idempotent (each call stages another edit); it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"op":{"type":"string","enum":["replan_scenes","set_piece_fields","set_scene_fields","set_visual","swap_voice"]},"args":{"type":"object","description":"Op arguments (see description)."}},"required":["project_id","op","args"]}},{"name":"author_op","title":"Re-author with the LLM (paid)","description":"Runs ONE edit op that re-authors with the LLM — the SAME op the human director runs from the chat — and stages its result into the project's conversation draft, which becomes a new version when it is committed. The call waits up to 60 s for the pass (50 of the 58 authoring turns measured finished within that) and answers with the staged edit (`outcome: completed_inline`); a longer pass keeps running and the answer is its job (`outcome: still_running`, `runId`), which the project status reports by `run_id`. An identical call while the job runs, or within 15 minutes after it succeeded, returns the SAME job, so a retry is not charged twice; `request_id` names a deliberately repeated request. One authoring turn at a time per project (`authoring-in-progress`).\nOps:\n- `revestir_como_autor`: Re-dress ONE scene's visual as an animated author's scene (a world with an actor where the data lives), keeping the narration word for word; for a still image held too long. LLM. Args: scene_index, brief? (only the VISUAL is re-dressed as an animated author's scene by the piece's director; the narration stays word for word, so the voice is reused; brief orients the world/actor).\n- `rewrite_scene`: Re-author one scene (script and visual) under a brief. LLM. Args: scene_index, brief (the WHOLE scene is re-authored under the brief).\n- `tighten_hook`: Strengthen the opening hook (scene 0). LLM. Args: brief? (scene 0).\nRequires the `write` scope. Spends LLM budget (charged like a chat turn).","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Runs one LLM re-authoring pass (`rewrite_scene`, `tighten_hook`, `revestir_como_autor`) whose result is staged into the project's draft (the call waits up to 60 s; a longer pass continues as a job); the pass is debited from the organization's prepaid wallet and not refunded, hence destructive. Not idempotent (an identical call within the turn window returns the same job, a later one is a new paid pass); it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":true,"spendsBudget":true,"chargesWallet":true,"spend":{"kind":"director","wallet":"core_preflight","charge":"in_the_turn","conditional":false},"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"op":{"type":"string","enum":["revestir_como_autor","rewrite_scene","tighten_hook"]},"args":{"type":"object","description":"Op arguments (see description)."},"request_id":{"type":"string","description":"Optional: a caller-chosen key for this request (up to 64 characters). The same key returns the same job for 24 h; a new key runs it again. Without it, an identical call within 15 minutes is the same request."}},"required":["project_id","op","args"]}},{"name":"run_op","title":"Run an edit op (deprecated)","description":"DEPRECATED since 2026-09-27, kept until at least 2026-10-27: the edit ops are split by cost between two tools, one for the free deterministic ops and one for the paid LLM re-authoring ops (`invocableVia` in the op catalogue names them). This alias routes each op to the tool that owns it and answers what that tool answers, plus a `deprecated` notice that names it.\nOps:\n- `replan_scenes`: Reorder the scenes (a permutation of indexes). Deterministic, $0. Args: order=[int...].\n- `revestir_como_autor`: Re-dress ONE scene's visual as an animated author's scene (a world with an actor where the data lives), keeping the narration word for word; for a still image held too long. LLM. Args: scene_index, brief? (only the VISUAL is re-dressed as an animated author's scene by the piece's director; the narration stays word for word, so the voice is reused; brief orients the world/actor).\n- `rewrite_scene`: Re-author one scene (script and visual) under a brief. LLM. Args: scene_index, brief (the WHOLE scene is re-authored under the brief).\n- `set_piece_fields`: Set PIECE-level fields (production_score: silence_plan, music_intent, narrative_arc…), validated by the schema. Deterministic, $0. Args: fields (partial production_score: silence_plan, music_intent, narrative_arc, expected_total_duration_sec…; lists replace).\n- `set_scene_fields`: Set concrete fields of one scene (narration, duration, silences, infographic data…), validated by the schema. Deterministic, $0. 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_visual`: Set a scene's visual type and/or visual prompt. Deterministic, $0. Args: scene_index, visual_type?, visual_prompt?.\n- `swap_voice`: Change the voice (semantic attributes) of one scene or all of them. Deterministic, $0. Args: voice_spec={...} (semantic attributes only: timbre, cadence, accent, language, apparent_gender, voice_style — NOT a voice id: the concrete voice is a piece-level decision made when the piece is created; a scene has no voice pin of its own, for the human either), scene_index?.\n- `tighten_hook`: Strengthen the opening hook (scene 0). LLM. Args: brief? (scene 0).\nRequires the `write` scope. The deterministic ops are $0. Spends LLM budget only on the authoring ops (charged like a chat turn); the deterministic ops are $0.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Deprecated alias that routes each edit op to the tool that owns it — the free deterministic ops or the paid LLM re-authoring ops; because it can reach the paid ops it is annotated destructive, like the paid tool. Not idempotent; it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":true,"spendsBudget":true,"chargesWallet":true,"spend":{"kind":"director","wallet":"core_preflight","charge":"in_the_turn","conditional":true},"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"op":{"type":"string","enum":["replan_scenes","revestir_como_autor","rewrite_scene","set_piece_fields","set_scene_fields","set_visual","swap_voice","tighten_hook"]},"args":{"type":"object","description":"Op arguments (see description)."},"request_id":{"type":"string","description":"Optional: a caller-chosen key for this request (up to 64 characters). The same key returns the same job for 24 h; a new key runs it again. Without it, an identical call within 15 minutes is the same request."}},"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 the instruction, picks the ops (rewrite_scene / set_scene_fields / set_visual / swap_voice / replan_scenes / tighten_hook) and applies them to the staged draft. Suited to an editorial change that spans several fields or scenes («make scene 3 quote the source verbatim and shorten the closing»); a single exact op has its own tools. The call waits up to 60 s for the turn (50 of the 58 turns measured finished within that) and answers with the reply, the staged ops and the coherence report (`outcome: completed_inline`); a longer turn keeps running and the answer is its job (`outcome: still_running`, `runId`), which the project status reports by `run_id`. An identical call while the turn runs, or within 15 minutes after it succeeded, returns the same job, so a retry does not pay a second turn; `request_id` names a deliberately repeated request. One authoring turn at a time per project (`authoring-in-progress`). The staged draft becomes a version when it is committed. Requires `write`. Spends LLM budget (charged like a chat turn); a turn whose planned edits all fail stages nothing and is not charged (`editOutcome: none_applied`).","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Runs one Director turn that picks and stages edits into the project's draft (the call waits up to 60 s; a longer turn continues as a job); the turn is debited from the organization's prepaid wallet and not refunded, a transaction that cannot be undone, hence destructive. Not idempotent (an identical call within the turn window returns the same job, a later one is a new paid turn); it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":true,"spendsBudget":true,"chargesWallet":true,"spend":{"kind":"director","wallet":"core_preflight","charge":"in_the_turn","conditional":false},"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"message":{"type":"string","description":"The instruction to the Director, in any language."},"active_scene_index":{"type":"integer","description":"Optional: the scene the instruction refers to (0-based)."},"quality":{"type":"boolean","description":"Reasoned authoring pass (slower, better). Default false."},"request_id":{"type":"string","description":"Optional: a caller-chosen key for this request (up to 64 characters). The same key returns the same job for 24 h; a new key runs it again. Without it, an identical call within 15 minutes is the same request."}},"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 the new version as a branch instead, in the version timeline, where it can become the cut later. Requires `write`. $0.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Writes a new version from the staged draft and makes it the cut; the previous cut stays in the version history (it can be made the cut again), so nothing is discarded and nothing is charged. Not idempotent (each call with a staged draft creates another version); it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"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 from the organization's balance by default, behind the same gates the human passes (the org's quota, the daily free-action cap and the balance): with `production.auto_produce=true` (the default) the whole production line runs without further calls. 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 to the final video: script → studio build → final render; publishing is not part of it. The script (first station) is written before the balance is checked and settles with the first render; the studio build and the final render check the balance and stop the line with `waitingForFunds` when it does not cover them. With `auto_produce=false` the line stops after the script, so the piece can be edited before production. Returns the project id and the cast as pinned (`cast.voice` / `cast.face` with `id` and `@handle`); the project status reports progress until `finalVideoUrl` is set (typically 20-60 min). Requires `write`.\n`creative_referent`: a referent id from the catalogue of formats. Premium formats (`requiresSpendConfirmation`) also need `production.confirm_spend=true`.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Creates a new project and starts its production line; the script, the build and the render are debited from the organization's prepaid wallet and not refunded, a transaction that cannot be undone, hence destructive. Not idempotent (each call creates another project); it acts only inside the caller's Vixdeo account, and the providers Vixdeo uses internally are not reachable through it.","readOnly":false,"destructive":true,"spendsBudget":true,"chargesWallet":true,"spend":{"kind":"creation","wallet":"priced_request","charge":"at_settlement","conditional":false},"inputSchema":{"type":"object","properties":{"prompt_seed":{"type":"string","maxLength":16000,"description":"The request, in the creator's words. A single idea is enough; a full brief is honored whole: title, thesis, structure and timing, how the piece opens and closes, what it may claim and from which sources, its look and sound, what to avoid, text that appears on screen. The writers and the direction receive it complete, up to 16000 characters; a longer request is rejected, and long reference material travels in `source`. Sources named by URL are read as primary material; when the request states that facts come only from them, nothing outside those sites is used."},"creative_referent":{"type":"string","description":"The format referent id from Vixdeo's catalogue of formats."},"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":"The creator's OWN material. `kind=script` + `respect=strict`: the piece narrates the text verbatim (word-level control from the start); `kind=content`: an article or notes the Director adapts (`respect` guided|adaptive). Without it the Director writes 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"]},"material":{"type":"array","description":"The creator's own uploaded files that belong to this piece (footage, photos, a recorded voice). Each item names one file of the personal library by its `assetId`: the id alone, or an object with `asset_id` and a `purpose` (what the file is for in the piece). The files are stored with the piece; the answer says what the piece does with them (`direction`), and they are not part of the price. While a file is still being verified, the `handle` of its upload is accepted in place of the id, and the request is answered as not ready; a file that is not in the caller's library is answered as not usable.","items":{"anyOf":[{"type":"string","description":"The `assetId` of a file of the personal library."},{"type":"object","properties":{"asset_id":{"type":"string","description":"The `assetId` of a file of the personal library."},"purpose":{"type":"string","description":"What the file is for in the piece, e.g. 'the interview that closes the piece'."}},"required":["asset_id"]}]}},"cast":{"type":"object","description":"Who narrates and who appears, in THREE ways that combine: (a) a name from the catalogue of voices and presenters, by `id` or `@handle` (`voice` / `face`) — a name that does not resolve is an error, not a silent fallback; (b) the wanted presenter DESCRIBED in `describe_face`, which casting resolves to the closest face of 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) nothing, and casting decides by ear. `on_camera` puts the presenter on screen. A named `face` wins over `describe_face`.","properties":{"voice":{"type":"string","description":"A voice `id` or `@handle` from the catalogue of nameable voices."},"face":{"type":"string","description":"A presenter `id` or `@handle` from the catalogue of nameable presenters."},"on_camera":{"type":"boolean"},"describe_face":{"type":"object","description":"The wanted presenter, in words, for when no catalogue handle fits. Casting resolves it against the catalogue and may generate one.","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":"The production settings; without them, the platform defaults apply.","properties":{"auto_produce":{"type":"boolean","description":"Whether the whole line runs to the final video (default true)."},"budget_tier":{"type":"string","enum":["economy","standard","premium"],"description":"Material budget of THIS piece: economy | standard | premium — which visual sources the piece buys (generated video only under premium). A production setting, chosen per piece."},"duration_profile":{"type":"string","enum":["short_discovery","short_deep","watch_bridge","watch_standard","longform_monetizable","longform_feature","feature_documentary"],"description":"Target length profile (`durationProfiles` in the catalogue of formats gives the seconds)."},"subtitle_language":{"type":"string","description":"Language of the SUBTITLES (BCP-47: `es`, `pt-BR`…), its OWN axis, independent of `target_language`: without it the subtitles follow the piece; with it the piece is narrated in one language and read in another (measured: 21 live projects declare the two on purpose)."},"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 (`writingProfiles` in the catalogue of formats gives each profile's meaning and the measured cost/time ratio per format). Default `estandar`."},"scene_author_profile":{"type":"string","enum":["estandar","premium"],"description":"Who writes the data scenes of a format that writes them (`sceneOptions.appliesTo`): `estandar` is the production author (Claude Opus 5.5 at the usual effort); `premium` is the same model thinking harder (maximum effort, more time and turns per scene; measured at $4.75-5.36 per scene, about 5-6x the standard author, and 26-30 min per scene — `sceneOptions` gives the measure). Without it the budget tier sets it (`estandar` in every tier). Choosing `premium` requires a spend confirmation."},"scene_finish":{"type":"string","enum":["ninguno","seedance"],"description":"Photoreal finish of the data scenes: `seedance` restyles each scene's world into generated footage (text and figures stay Vixdeo's own); `ninguno` ships the scene as drawn. Without it: `ninguno` in every tier. The finish is PAUSED by a product decision (2026-10-20) until a new experiment: while `sceneOptions.sceneFinish[].paused` is true, declaring `seedance` is accepted, buys nothing and resolves to `ninguno` with reason `pausado` (the priced request echoes it as `sceneFinishReason`). When not paused it is honored only where the tier pays for generated video, and choosing it there requires a spend confirmation."},"target_duration_sec":{"type":"number","description":"Exact target length in seconds (e.g. 210 for «3:30»). It governs the duration profile: if it falls outside the profile's range, the profile whose range contains it governs and the response says so (`durationProfileSource: target_duration_sec`, `durationProfileDisplaced` names the profile it replaced). Without a profile it picks the one that contains it. Without it the profile's own target governs."},"period_rigor":{"type":"string","enum":["note","rebuy"],"description":"What happens when the era check finds an anachronism in a GENERATED shot (a modern helmet in 1906): `note` records it and mounts the shot; `rebuy` buys the shot again ONCE, telling the generator what to leave out, within the piece's recomposition cap. Without it the budget tier decides (premium rebuys; standard and economy note)."},"confirm_spend":{"type":"boolean","description":"True confirms the spend of a format that declares `requiresSpendConfirmation`; the wallet also has to cover the band, otherwise the answer is `insufficient-funds-for-estimate` and no project is created."},"confirmed_request_ref":{"type":"string","description":"Alternative to `confirm_spend`: the `economics.requestRef` of the price quote for THIS exact request — an informed confirmation. A ref of another request is rejected (`spend-not-confirmed`)."}},"required":[]}},"required":["creative_referent"],"anyOf":[{"required":["prompt_seed"]},{"required":["source"]}]}},{"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 render, publication) with status and cost, `publication` (whether the piece is published and whether the cut changed since), and — when delivered — `finalVideoUrl` with `finalVideoDurationSec`, the measured length of the delivered file. `latestRunByKind` is a compact index by run kind; the full objects live in `runs`. With `run_id` — the id of a job that an asynchronous authoring, rewrite or publication call returned — `job` reports that job: its status and, once completed, its result (a Director turn's reply and staged ops; a rewrite's new version; a publication's URL), or the reason it failed. `fidelityReport` is derived without a model from what the pipeline already wrote on the cut: per scene, the figures the narration says (the cited fact, the date the material gives for it and the figure's period when the data codex derived one), what the screen draws (each chart stage in drawing order with every value `drawn`, `approx` or `withheld`) and the facts the scene cites; per piece, the corpus policy, the closing card, the axes of the delivered final measured out of band, and the critic's scope — the house critic judges the script and does not see the charts or each figure's period. `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},"effect":"reads","reach":"own_account","annotationsRationale":"Read-only: reports a project's production state, runs, costs and delivery links; it creates and changes nothing. It stays inside the caller's Vixdeo account.","readOnly":true,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"run_id":{"type":"string","description":"Optional: a job id (`runId`) returned by an asynchronous tool of this project."}},"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. Each note says where it comes from (`source`): `critic` is the model's reading, `audit` is a contradiction checked against the research material without a model. `factualAudit` is the deterministic half: per scene, which facts it cites (`citations`), whether that backing was cited by the script, inferred from its text, or is text the author dictated in the request (`dictated_in_the_request`: a disclosure or a closing line — it is not a factual claim and is left out of `factualScenes`), and what happened to each on-screen figure the material does not carry (`onScreenClaims[].outcome`): `notAsserted` = it is not shown (stripped from the text, or its magnitude withheld from the chart), `drawnWithoutFigure` = plotted without its number, `stillAsserted` = left on screen; `placeholders` counts, also without a model, text that names with a letter or an order number what the source does not name («Repository A», «Server 1») or leaves a template marker («N/A», «TODO»), per scene and surface (narration, screen, caption); `inputs.script` says which document was judged (`vbp` = the version's blueprint, with its citations). `scope` states what the critic judges (`judges: script`) and what it does not see (`seesCharts`, `seesPeriods`): the charts and each figure's period are covered by the `fidelityReport` of the project status. Judgement only: it does not rewrite. The verdict is kept on the version as the critic wrote it; the critic judges in one language for every reader, and the notes returned are presented in the reader's language (`notesLanguage` says which, and whether they were translated). Defaults to the head version. Requires `write`. Spends one critic call (small, seconds), plus a short translation of its notes when the reader's language is not the critic's.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Appends the house critic's verdict to a script version without removing anything; the critic call, and the short translation of its notes for a reader of another language, are paid by Vixdeo and not charged to the organization's wallet, so it is not destructive. Not idempotent (each call records a new verdict); it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":false,"spendsBudget":true,"chargesWallet":false,"spend":{"kind":"editorial","wallet":"none","charge":"not_charged","conditional":false},"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-dresses only the scenes whose narration changed (visuals are kept). It covers a brief that spans the piece («more rhythm in the second act, and let the ending return to the thesis»); a single scene has its own re-authoring op. Asynchronous: returns a run id, and the project status reports the job by `run_id` — once `completed`, with the new version id (`job.result.editorialVersionId`, also in `latestRunByKind.editorial_rewrite`). `as_branch=false` (default) makes the result THE CUT the line renders, as committing a draft does. Writers that require spend confirmation need `confirm_spend=true`. Requires `write`. Spends LLM budget: a full script pass, priced like the writing profile of the piece (`writingProfiles[].measure` in the catalogue of formats).","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Starts an asynchronous rewrite that writes a new script version (earlier versions stay in the history); the rewrite is charged to the organization's prepaid wallet at the project's next render settlement and not refunded, hence destructive. Not idempotent (each call is a new paid rewrite); it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":true,"spendsBudget":true,"chargesWallet":true,"spend":{"kind":"editorial","wallet":"none","charge":"at_settlement","conditional":false},"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 writer requires spend confirmation (`requiresSpendConfirmation` in the catalogue of formats)."}},"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). Publishing is not part of it. Applies to a project created without auto-production once edited, and to a line that stopped. The answer says whether the tick was really enqueued (`dispatched`, `dispatch.reason`) and what the line will do (`line`). On a piece whose final is already delivered the line does not render again by itself: the answer then carries `finalRender` — whether the studio changed after that final, and the quote of a NEW final render — and with `confirm_spend=true` the new render is launched, the same act as the human's «produce again» in the studio. Requires `write`. Spends budget under the org's quota and the daily free-action cap (each call counts as one action).","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Starts or resumes the production line (studio build and final render), whose cost is debited from the organization's prepaid wallet and not refunded, hence destructive; it never publishes. Not idempotent (each call dispatches the line and counts as one daily action); it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":true,"spendsBudget":true,"chargesWallet":true,"spend":{"kind":"production","wallet":"none","charge":"at_settlement","conditional":false},"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"confirm_spend":{"type":"boolean","description":"Only for a piece whose final is already delivered: true launches a new final render (a paid render, quoted in `finalRender.quote`). Default false: the answer quotes it and launches nothing."}},"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 — production resumes later from what exists. Idempotent. Requires `write`. $0.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"effect":"discards","reach":"own_account","annotationsRationale":"Stops the production line and marks every run in progress as cancelled, which cannot be reverted (resuming production later starts new runs), hence destructive; nothing is deleted or charged. Idempotent (a second call finds nothing running); it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":true,"spendsBudget":false,"chargesWallet":false,"spend":null,"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 (ordered from the newest) with lineage: id, number, `sequence` (global position in the timeline, unique), parent, origin (script generation, an agent's or a human's edits, a 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` = replaced as the cut, kept in history (it can be made the cut again) · `discarded` = a Studio copy replaced when a script was approved or re-applied, kept in history (older versions: also a replaced cut) · `rewrite` = produced by a rewrite run. $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"effect":"reads","reach":"own_account","annotationsRationale":"Read-only: lists a project's version history and which version is the cut; it changes nothing. It stays inside the caller's Vixdeo account.","readOnly":true,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"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. Non-destructive: the previous cut stays in history (`superseded`); the next production run renders the new cut. Requires `write`. $0.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Moves the project's cut to an existing version; the previous cut stays in the version history and can be restored the same way, so nothing is discarded and nothing is charged. Idempotent; it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"version_id":{"type":"string","description":"A version id of the project's timeline."}},"required":["project_id","version_id"]}},{"name":"whoami","title":"Who am I","description":"The principal behind this credential: credential kind and scopes (`read` reads; `write` creates, edits and produces), 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, whether the user has accepted the legal terms in force (`legal`), and the server version. $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"effect":"reads","reach":"own_account","annotationsRationale":"Read-only: reports the credential's scopes, organization, attributed user and wallet balance; it changes nothing. It stays inside the caller's Vixdeo account.","readOnly":true,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"request_upload","title":"Request upload ticket","description":"Upload tickets for the creator's OWN material (a recorded interview, a product photo, drone footage, a recorded voice) so it can be kept in the personal library and placed in a piece. Three forms: one file (`filename` + `size_bytes`); a batch (`files`: one ticket per file, and a file that is refused carries its `reason` without stopping the others); or `handle` alone, which resumes an upload in parts — it returns the parts that arrived, the ones missing and signed URLs for the missing ones. The bytes travel outside this tool, straight to storage: a ticket's `upload` is one signed PUT (`url` + `headers`) or, with `resumable`, a list of `parts` — consecutive slices of `partSizeBytes`, each sent by PUT to its own `url` with its `headers` — that can be continued after an interruption until `expiresAt` (the session, about a day); each signed part url is valid until `upload.partsExpireAt` (about 1 h), and a 403 on a part past that is an expired url, not a failed upload: `request_upload` with only the `handle` re-signs the missing parts for free. The declared size is part of the signature. A video container that only carries sound (a browser recorder) is declared as `audio/webm` or `audio/mp4` and is registered as audio. Each ticket states the limit per file in force (`maxBytes`) and the space in use (`quota`); a refusal says which limit was reached and with which numbers. Accepted: gif/heic/heif/jpeg/jpg/png/webp images, mov/mp4/webm video and aac/m4a/mp3/wav audio. $0.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Issues signed tickets to upload the caller's own media to Vixdeo's storage, or signs the missing parts of an upload already in progress; nothing is overwritten or charged. Not idempotent (each call for a new file issues a new ticket); it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"inputSchema":{"type":"object","properties":{"filename":{"type":"string","description":"One file: its original filename with extension (the extension decides image, video or audio)."},"content_type":{"type":"string","description":"Optional MIME type of that file, accepted when it matches the extension."},"size_bytes":{"type":"integer","description":"Exact size of that file in bytes. Required with `filename`: the upload is signed for that size."},"resumable":{"type":"boolean","description":"Default false. True asks for an upload in parts that can be resumed, for the single file or for every file of the batch; a file that fits in one part still gets one PUT."},"files":{"type":"array","maxItems":20,"description":"A batch: one ticket per file, in the same order.","items":{"type":"object","properties":{"filename":{"type":"string","description":"Original filename with extension."},"content_type":{"type":"string","description":"Optional MIME type, accepted when it matches the extension."},"size_bytes":{"type":"integer","description":"Exact size of the file in bytes."}},"required":["filename","size_bytes"]}},"handle":{"type":"string","description":"Resumes an upload in parts: the `handle` of its ticket, with nothing else."}},"required":[],"anyOf":[{"required":["filename","size_bytes"]},{"required":["files"]},{"required":["handle"]}]}},{"name":"complete_upload","title":"Register uploaded material","description":"Confirms that uploads finished and registers them in the creator's personal library: one upload (`handle`) or several (`uploads`, each with its own outcome). Each file is verified without any provider being involved — it has to be in storage with the declared size and be real media; its content identifies it (the same file twice is one asset) and it is measured (kind, size, duration). `declared_content` is WHAT the material shows (≤240 chars): it is what lets a director place it on the right scene. The answer carries `stage` — `uploading` (the bytes are not all in storage yet) · `verifying` (the file is in storage and is being checked, identified by its content and measured) · `ready` (the file is in the library and has an `assetId`) · `failed` (the file did not make it into the library, and `reason` says why). Small files answer `ready` at once, with the `assetId` that places them on a scene; a larger one answers `verifying`, and the same request repeated later returns its current stage. $0.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"effect":"additive","reach":"own_account","annotationsRationale":"Registers uploaded files in the caller's personal media library after verifying them, identified by their content; nothing existing is replaced or charged and no provider is called. Idempotent (the same upload returns the same result and the same file is one asset); it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"inputSchema":{"type":"object","properties":{"handle":{"type":"string","description":"One upload: the `handle` of its ticket."},"declared_content":{"type":"string","description":"What the material shows, e.g. 'Interview with the harbour master, 2024, dock in background'."},"uploads":{"type":"array","maxItems":20,"description":"Several uploads at once; the answer has one outcome per item, in the same order.","items":{"type":"object","properties":{"handle":{"type":"string","description":"The `handle` of the upload ticket."},"declared_content":{"type":"string","description":"What this file shows."}},"required":["handle"]}}},"required":[],"anyOf":[{"required":["handle"]},{"required":["uploads"]}]}},{"name":"list_material","title":"List own material","description":"The creator's own material in the personal library — `assetId`, kind, filename, what it declares, size, duration and how many times a piece uses it — and, in `uploads`, the uploads still in progress or refused in the last day, each with its `stage` and `reason`. `kind` keeps one kind of file; `asset_id` returns one file with its content hash; `handle` returns the state of one upload. Nothing is written. $0.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"effect":"reads","reach":"own_account","annotationsRationale":"Read-only: lists the media the caller uploaded to their personal library and the uploads still in progress; it changes nothing. It stays inside the caller's Vixdeo account.","readOnly":true,"destructive":false,"spendsBudget":false,"chargesWallet":false,"spend":null,"inputSchema":{"type":"object","properties":{"limit":{"type":"integer","description":"How many files to return, newest first."},"kind":{"type":"string","enum":["image","video","audio"],"description":"Only files of this kind."},"asset_id":{"type":"string","description":"One file of the library, by its `assetId`; the answer adds its content hash (`sha256`)."},"handle":{"type":"string","description":"One upload, by the `handle` of its ticket: its `stage`, and its `assetId` once it is ready."}},"required":[]}},{"name":"assign_material","title":"Assign material to a scene","description":"Puts a library asset (own material from a registered 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 (it takes effect without committing a draft); the next final render picks it up. On a piece whose final is already delivered that next render is a NEW paid render, which the line does not start by itself; the answer says so (`deliveredFinal`). Requires `write`. $0.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"effect":"discards","reach":"own_account","annotationsRationale":"Replaces the visual of one scene with a library asset and resets the project's preview and publishing approvals, so the previous visual stops being the scene's, hence destructive; nothing is charged. Idempotent (the same asset on the same scene gives the same result); it acts only inside the caller's Vixdeo account.","readOnly":false,"destructive":true,"spendsBudget":false,"chargesWallet":false,"spend":null,"inputSchema":{"type":"object","properties":{"project_id":{"type":"string"},"scene_index":{"type":"integer","description":"0-based scene index (as in the Video Blueprint)."},"asset_id":{"type":"string","description":"The `assetId` of a registered upload or of an asset in the material library."},"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"]}}],"annotationRules":{"readOnlyHint":"true only when the tool reads and creates, changes, deletes or spends nothing.","destructiveHint":"true when the tool discards state that already existed (replaces a scene's visual, cancels runs in progress) or debits the organization's prepaid wallet: a charge that is not refunded is a transaction that cannot be undone. Additive writes that keep what existed (a new version, a staged draft, a cut moved to another version while the previous one stays in the history) are not destructive.","idempotentHint":"true when repeating the same call with the same arguments has no further effect.","openWorldHint":"false for every tool: each one reads or writes only the caller's own Vixdeo organization (projects, versions, media library, wallet) and Vixdeo's catalogue. The providers Vixdeo uses internally to produce a video are not addressable through any tool, and no tool publishes, posts or messages anyone outside the account (publishing is a human decision this server does not expose)."},"note":"The same catalogue `tools/list` returns over MCP, published without credentials so the contract can be audited (annotations included, with the rationale behind each). Calling any tool still needs a credential."}