CueFrame

ai.cueframe由 cueframe.ai 发布官方发布者v1.2.0更新于 Oct 24, 2026

Turn footage into finished video: reframing, captions behind the subject, motion graphics, renders.

已验证Streamable HTTP可网页运行媒体与设计AI 与机器学习

概览

AI 生成的概览

CueFrame 是托管式视频服务,其 MCP 服务器让助手用素材、字幕和动态图形编排、编辑、预览并渲染出 MP4 视频。

可以做什么
  • 创建、列出和修改定义视频意图的 brief
  • 执行编辑流程:读取已认证的源片段范围,检查画面、运动、音频和转写,追加有证据支撑的发现,整合并应用修改
  • 编排与编辑合成:启动 Director 编排任务、以事务方式应用合成操作、校验、咨询并选择候选方案
  • 预览与评分:静帧、组件预览、限定范围的动态片段预览以及服务端评分
  • 渲染与交付:排队 MP4 渲染、等待长任务完成并处理审批检查点
  • 浏览组件库、模板与组件源码,并创建自定义组件
适用场景
适合让助手把素材做成成片——重新构图、主体后方字幕、动态图形、渲染——或对已有可编辑项目做局部修改,并在付费渲染前先预览和估算成本。
运行要求
远程 Streamable HTTP 端点 api.cueframe.ai,托管服务器无需本地运行时。认证方式为交互式 OAuth 登录,无头客户端则使用 Bearer API 密钥。云端操作需要带额度的 CueFrame 账号。可选的安装器与 CLI 需要 Node.js 24 或更高版本。
安装前请注意
云端操作会消耗额度,每次渲染单独计费,付费前应先查看余额与预估成本。服务器会写入项目和合成、应用修改、创建和删除 brief 并排队渲染。无头方式需提供 Bearer API 密钥,应妥善保密。上传的素材与项目数据会发送到第三方托管服务。

安装

在 SourceWeft 中

  1. 打开 控制台中的 CueFrame,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/ai.cueframe%2Fcueframe/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "cueframe": {
      "type": "http",
      "url": "https://api.cueframe.ai/v1/mcp"
    }
  }
}

README

CueFrame — MCP, CLI and video API

[MCP: Streamable HTTP] [Agent Skills] [License: Apache-2.0] [Documentation]

CueFrame is a hosted service for composing, editing and rendering video. Connect your agent over MCP, automate an edit from the CLI, or integrate the REST API into your application. Each surface works with editable projects containing clips, captions and motion graphics, and renders them to MP4.

Your workflowStart here
Ask an agent to make or edit a videoMCP and agent plugin
Run video workflows from a terminal or scriptCLI
Build video editing into an applicationAPI and TypeScript SDK

First render · Connection guide · Templates · API reference · Agent documentation index

[A real CueFrame render: PHENOMENAL behind a Yosemite ranger, with word-timed captions]

A frame from the Yosemite Peregrines template. Watch the video and try the same edit.

MCP and agent plugin

For Claude Code, Codex, Cursor, VS Code, and other supported local agents, run this in your terminal with Node.js 24 or newer:

bash
npx -y [email protected] install

The installer detects supported agents and adds the hosted CueFrame MCP endpoint to their configuration. It installs the skills in ~/.agents/skills and ~/.claude/skills, preserving locally modified skills by default. It can update multiple detected clients; use --dry-run to inspect the changes first.

Restart your agent session. Then ask:

Use CueFrame's get_account tool to check my connection and show my available credits.

Your client may prompt you to authenticate or open a browser. Sign in to CueFrame and authorize the connection; interactive OAuth clients need no API key. Cloud operations use credits. Check your balance and estimated costs before starting paid work; see cloud rates.

ChatGPT and Claude Desktop: use your client's hosted connector setup with https://api.cueframe.ai/v1/mcp, then authenticate. The terminal installer does not configure ChatGPT. See the connection guide and CueFrame connection skill for supported paths. Skills installation and hosted connector setup are separate steps.

Already connected? Skip installation and give your agent a video task. If CueFrame's tools do not appear, restart the client and check its MCP connection settings.

Make your first video

Try the Yosemite first-render walkthrough: render a template, change one word, and render again from the same project.

  1. Download the full original footage from the National Park Service as yosemite-peregrines.mp4. Use the original source, because the finished demo has its title baked in. Follow the source's download and reuse guidance.

  2. Give your connected agent the source file and this instruction:

    Use CueFrame to start the yosemite-peregrines template from cueframe-ai/cueframe-templates with this original video. Load template.cueframe and its prepared subject matte. Preview the editable project and estimate cloud costs. After I approve the render, return the MP4 link and project ID.

  3. After the first render, ask:

    In that same project, replace the behind-subject title PHENOMENAL with EXTRAORDINARY. Preserve the footage, spoken captions, audio, timing, placement, and depth. Preview the changed title, estimate the render cost, and render after I approve.

The template selects 83.616–93.359 seconds of the original video. You should get two MP4s from one editable project. Uploading footage and running cloud operations use credits; the two renders are billed separately.

[The same Yosemite project open in CueFrame Studio, with EXTRAORDINARY selected as an editable title layer]

The project stays editable: the desktop editor shows the title as a separate layer, alongside footage and captions. Watch the title change.

What happens over MCP?

mermaid
flowchart LR    A[Your request + footage] --> B[Your agent + CueFrame skills]    B --> C[Hosted CueFrame MCP]    C --> D[Editable project + preview]    D --> E[Render job → MP4 link]

The agent inspects available tools, checks your account, prepares media and the project, previews changes, and submits a render. Long-running operations return IDs; the agent waits for completion and gives you the result. You do not need to write the tool calls yourself. The detailed quickstart explains the individual calls.

Starting a new video or adding to an existing edit? See when to start a template versus insert a component for discovery, media bindings, exact selection, preview and render.

For your next video, describe the result and provide the inputs:

Turn this interview into a 20-second vertical clip with word-timed captions. Preview the strongest moment and show estimated costs before rendering.

Find an image-carousel component for these product photos. Show suitable choices and their required inputs before creating the video.

Change only the final title in this project. Keep the rest of the edit unchanged.

Other installation options

Choose one setup path. A plugin installs the skills and hosted MCP configuration together. A server-only connection adds tools; skills provide the workflow guidance.

Claude Code and Codex plugins

Claude Code:

bash
claude plugin marketplace add cueframe-ai/cueframe-mcpclaude plugin install cueframe@cueframe

Codex:

bash
codex plugin marketplace add cueframe-ai/cueframe-mcpcodex plugin add cueframe@cueframe

Restart the session, authenticate when prompted, and ask the agent to call get_account.

Gemini CLI and Agent Skills clients

Gemini CLI:

bash
gemini extensions install https://github.com/cueframe-ai/cueframe-mcp

Install skills in any client that supports Agent Skills:

bash
npx skills add cueframe-ai/cueframe-mcp

Skills alone do not connect the MCP server. Add the hosted endpoint through your client's MCP settings if it is not already connected.

MCP server only, manual setup, and headless clients

The hosted endpoint is https://api.cueframe.ai/v1/mcp, using Streamable HTTP. For example, in Claude Code:

bash
claude mcp add --transport http cueframe https://api.cueframe.ai/v1/mcp

For Cursor and VS Code, use the one-click links in the connection guide. Configuration keys differ between clients. Per-client examples are in examples/.

Interactive clients can use browser sign-in. Headless clients send Authorization: Bearer cf_live_…; see llms-install.md for authentication and stdio bridge options. The glama/ shim executes no tools and cannot be used to make videos.

Skills included

Skills teach the agent how to carry out video tasks. You describe the task; the agent selects the relevant guidance.

TaskSkills
Plan and compose a new videocueframe-storyboard, composing-video
Clip a podcast or interviewclip-a-talking-head
Make a launch film or social reellaunch-video, make-a-social-reel
Make a brand reel or change an existing brandbrand-reel, rebrand-a-video
Extract a visual styleextracting-brand-kits
Create a product democueframe-brand-demo, cueframe-product-video
Customize motion graphics or make a 3D shotcueframe-component-authoring, cueframe-scene-shot
Add music or adapt to more formatsadd-music-bed, every-format-from-one-edit
Preview, refine, and check qualitycueframe-compose-loop, video-craft-standards
Connect or work through the CLIcueframe-connect, cueframe-cli

Claude Code's session hook and Cursor's rule help select the entry point. Other hosts load the installed skills through their own mechanisms. Scoped edits should preserve unrelated work.

CLI

Use the CLI for explicit video commands, shell scripts and structured JSON output. It connects to the hosted API; it does not run a local renderer. Requires Node.js 24 or newer.

bash
npx -y [email protected] --helpnpx -y [email protected] loginnpx -y [email protected] api GET /v1/me --jsonnpx -y [email protected] describe --json

login opens the browser to authenticate. Headless scripts can supply CUEFRAME_API_KEY. The account request checks your connection and credits; describe lists command arguments and options without making an API call.

CLI guide · CLI walkthrough · Templates · npm package

API and TypeScript SDK

Use the REST API to create projects, import media, change compositions and follow render jobs from your application. Requests go to https://api.cueframe.ai with an API key from your account. Check your account before metered operations; cloud rendering and processing use credits.

For TypeScript or JavaScript on Node.js 24+, install the typed client:

bash
npm install @cueframe/sdk
js
import { account, createClient } from "@cueframe/sdk";
if (!process.env.CUEFRAME_API_KEY) throw new Error("Set CUEFRAME_API_KEY");createClient({  baseUrl: "https://api.cueframe.ai",  apiKey: process.env.CUEFRAME_API_KEY,});const result = await account.getAccount();console.log(result.plan, result.entitlements);

Other languages can call REST directly or generate a client from the versioned public OpenAPI contract. The SDK is a client for the hosted service, not the server implementation.

API walkthrough · API reference · SDK guide · Render example · npm package

What this repository contains

This repository contains the agent plugin, developer toolkit, and registry files. The hosted MCP server is maintained separately in the application repository. You connect to CueFrame's hosted service; cloning this repository does not run that service locally.

AreaWhat you can use or contribute
skills/, host manifests, hooks/, rules/Agent workflows, plugin installation, and task routing
packages/The public API contract, TypeScript SDK, CLI, and packaged skills
examples/, llms-install.mdClient setup and an end-to-end SDK render example
server.json, glama/Hosted-server registration and a discovery-only shim
tools/, scripts/Generators, validation, packaging, and repository checks

Contribute

Documentation, client examples, skill improvements, and toolkit fixes are welcome. Start with good first issues or read CONTRIBUTING.md for setup, generated-file rules, tests, and commit sign-off.

Edit skills in root skills/; change generated API clients through their documented inputs. Report hosted-service problems in this repository's issue tracker with reproduction steps and a request ID when available. Report vulnerabilities privately using SECURITY.md. Community participation follows the Code of Conduct.

Published packages

PackagePurposenpm
@cueframe/api-contractThe public OpenAPI document, its reviewed operation inventory and a content-addressed manifest: the only input the generated clients read.[npm]
@cueframe/sdkTyped fetch-based TypeScript client with zod request schemas and SSE helpers for render and compose progress.[npm]
cueframeThe CLI: login, projects, media, compositions, renders, exports and install, every command with --json.[npm]
@cueframe/skillsThe skills/ tree as an npm package (SKILLS_DIR from @cueframe/skills/dir), for programs that copy or embed the skills.[npm]

The MCP server itself (@cueframe/mcp) is a private package maintained in the application repository; this repository ships the contract it is generated from, the clients, the plugin, the registry entry (server.json) and a discovery shim, not the server.

How the contract flows

private API ──sync──▶ api/openapi.json (+ scene-schema.json, scene-examples.json, contract-manifest.json)                          │                          ├──▶ packages/api-contract/dist  ──publish──▶  @cueframe/[email protected] ──▶ the MCP server's generators, third parties                          └──▶ packages/sdk/src/generated        (Orval: operations, models, zod)

The private API publishes its OpenAPI projection into api/; pnpm generate:api-consumers regenerates the SDK from it. This is the one copy of the contract: the MCP server's generators in the application repository and every other consumer read it from the @cueframe/api-contract npm package, whose version moves with the contract (pnpm check:contract-version fails an api/*.json change without a bump), so the tool surface and the SDK always describe one contract. Nothing under api/ or a generated/ directory is hand-edited: pnpm check:api-inputs proves the three api/*.json inputs came from one sync, and pnpm check:api-consumer-drift proves the generated trees match them byte for byte.

How the skills flow

Root skills/ is the single source: the plugin hosts read it from this repository, and pnpm build copies it into packages/skills/dist (published as @cueframe/skills) and from there into the CLI's dist/skills for cueframe install. pnpm check:plugin validates every skill and manifest; agents/openai.yaml and assets/icon.svg beside each skill are generated.

Registry files

  • server.json: the MCP registry entry for the hosted server (ai.cueframe/cueframe, remotes only). pnpm check:server-json validates it against the vendored registry schema; the registry job of the publish workflow publishes it.
  • glama.json: the Glama listing's maintainer file.
  • Smithery listing: the directory entry for the hosted server. No file here drives it; it is edited on Smithery.
  • glama/ and the Dockerfile: a stdio discovery shim that replays a snapshot of the hosted server's tool list and instructions for registries that introspect over stdio. It is not a server (see below).

Hosted, desktop-local, and the discovery shim

The hosted service, desktop integration, and registry shim serve different purposes.

  • The hosted server at https://api.cueframe.ai/v1/mcp is the product. Every install line above talks to it; it authenticates with OAuth or an API key and does the composing and rendering. Its package, @cueframe/mcp, is private.
  • The CueFrame desktop app ships its own local MCP server for the project you have open. It needs no account and is connected through the connection file the app publishes; the app's Agents settings show the exact command, and https://docs.cueframe.ai explains it. Its bundled binary is called cueframe-mcp; it lives inside the app bundle.
  • This repository's discovery shim (glama/server.mjs, built by the Dockerfile) is not a server. It replays a snapshot of the hosted server's tool list and instructions over stdio so registries that build an image can list the tools without an account; every tools/call answers with a pointer to the hosted server. glama/refresh-snapshot.md says where the snapshot comes from.

Repository layout

  • skills/<name>/SKILL.md: the skill. agents/openai.yaml and assets/icon.svg beside it are generated (pnpm build:plugin).
  • .claude-plugin/, hooks/, .mcp.json: Claude Code plugin, session router and server.
  • .codex-plugin/, .agents/plugins/, mcp.json: Codex and ChatGPT plugin and marketplace.
  • .cursor-plugin/, rules/: Cursor plugin and the always-on rule.
  • gemini-extension.json, skills.sh.json, plugin.json: Gemini CLI, skills.sh, the portable manifest (agent-plugins.org).
  • api/, packages/, tools/, scripts/: the contract, the four npm packages, their generators and checks (scripts/plugin/ holds the plugin's).
  • server.json, glama.json, glama/, Dockerfile: the registry files.
  • catalog/: the tool reference and error codes exported from the MCP catalog in cueframe-ai/cueframe (pnpm --filter @cueframe/mcp export:tool-reference -- <this repository>/catalog there). skills/cueframe-connect/references/tools.md is rendered from it, and the skills check reads it: a skill may name only a tool it lists.
  • examples/, llms-install.md: per-client setup and the agent-readable install guide.

Development

pnpm installpnpm check      # input provenance, the contract version rule, the public-contract gate, server.json, the plugin, and tsc --noEmit in sdk and clipnpm build      # stamps the plugin manifests and skill cards, then tsup in every package; the CLI packages the skillspnpm test

Node 24 or newer and pnpm (see .nvmrc and packageManager). CONTRIBUTING.md explains which paths are generated, the skill contract and how a change travels; AGENTS.md is the same for an agent working in this tree; llms-install.md connects a client step by step.

License

Apache-2.0. See LICENSE and NOTICE.

来源:README.md,提交 75a3644

工具

95

editorial_run_source

Editorial Run Source

Read the certified decode representation for media selected in this project before starting an editorial run. Supply projectId and mediaId; a null representation means this source cannot be pinned. The response omits internal storage paths. Select a bounded range from the returned frameCount and exact fps ratio; do not invent a source identity.

输入参数mediaId必填projectId必填

editorial_list_briefs

Editorial List Briefs

Recover persisted authored briefs for a project. Read bounded pages; pass nextCursor as cursor until done. Brief IDs link to editorial runs.

输入参数limitcursorprojectId必填

editorial_list_runs

Editorial List Runs

Recover persisted editorial runs for a project in bounded pages. Pass nextCursor as cursor until done, then read each relevant run for its integration decisions and unresolved gaps.

输入参数limitcursorprojectId必填

editorial_get_run

Editorial Get Run

Read a persisted editorial run, including its revision, state, inputs, outline, selected finding IDs, omitted reasons and unresolved integration gaps. Read findings and evidence separately for complete coverage.

输入参数runId必填

editorial_list_evidence

Editorial List Evidence

Read delivered evidence and inspection coverage for a run in bounded pages. Pass nextCursor as cursor until done; an empty page does not prove the whole source was inspected.

输入参数limitrunId必填cursor

editorial_findings_list

Editorial Findings List

Read durable observations, including useful, nothing-useful and uncertain outcomes, in bounded pages. Pass nextCursor as cursor until done; retain evidence IDs, supersession and uncertainty when recovering decisions.

输入参数limitrunId必填cursor

editorial_create_brief

Editorial Create Brief

Persist an authored brief for the selected project. The projectId belongs in body.brief; use the returned briefId to start an editorial run.

输入参数body必填commandId

editorial_create_run

Editorial Create Run

Start an editorial run from a persisted brief and explicitly selected certified source ranges. Read editorial_run_source for each project media source first; use its exact identity, revision, frame count and fps ratio. Never invent a source pin or infer inspection from an index.

输入参数body必填commandId

editorial_inspect_source

Editorial Inspect Source

Deliver one exact decoded source frame as JPEG and save its evidence receipt. Only that sampled frame is visually inspected; preserve the returned evidenceId and coverage.

输入参数body必填runId必填commandId

editorial_sample_motion

Editorial Sample Motion

Deliver bounded sampled motion frames and save their evidence receipt. The sampled frames do not certify continuous visual coverage.

输入参数body必填runId必填commandId

editorial_inspect_audio

Editorial Inspect Audio

Deliver a bounded 16 kHz source audio interval and save an audio evidence receipt. The interval must lie inside a certified run input.

输入参数body必填runId必填commandId

editorial_inspect_transcript

Editorial Inspect Transcript

Deliver at most 100 verified transcript words with their mapped certified decode interval and save a transcript evidence receipt.

输入参数body必填runId必填commandId

editorial_findings_append

Editorial Findings Append

Persist one evidence-backed observation. A nothing_useful outcome may cover only what the cited evidence actually inspected; sparse stills do not certify an unsampled interval.

输入参数body必填runId必填commandId

editorial_integrate

Editorial Integrate

Save selected finding IDs, explicit omitted reasons and unresolved gaps with the observed run revision. Read the run and findings before deciding.

输入参数body必填runId必填commandId

editorial_apply

Editorial Apply

Commit an integrated editorial edit to the saved project composition with both runExpectedRevision and guarded composition fields. Preserve the observed concurrency basis and the composition journal identity: nested composition.commandId must equal composition.clientId + ":" + composition.sequence. The session call commandId is a separate HTTP request identity.

输入参数body必填runId必填commandId

compose

Compose

Start an async Director compose job: it authors an ensemble of full composition candidates, verifies each, and saves the winner to the project. Body must set EXACTLY ONE source (mutually exclusive): `briefId` — author FROM a persisted Brief (the PLANNED path: create_brief first; every Brief field is honored or the compose is refused loudly naming the field); `fromComposition: true` — author from the project's CURRENT composition (the GENERAL path: seed it with apply_composition first — your media clips are the intent, and any graphics you authored are CARRIED VERBATIM as locked clips the Director authors around, never re-authors or drops); or `suggestionId` — author from an AI clip suggestion (the CLIPPING path, paired with suggest_briefs). Returns { composeJobId, status, streamUrl }. Then call wait_job(kind="compose", id=composeJobId, projectId=...) to block until the winner is selected.

输入参数body必填commandIdprojectId必填

apply_composition

Apply Composition

Atomically apply an array of CompositionOps to a project composition. All ops succeed or none do (transactional). Call describe_composition_ops without type for the compact operation list, then with a type for its exact JSON Schema. For negotiated component execution, read get_composition with componentExecutionVersions=["3","4"] and includeDependencies="true", then send componentExecutionVersions:[3,4] and that exact expectedBrandIdentity. A changed brand refuses the command; never refresh the witness to conceal a conflict. Explicit builtinSources selectors attach only the approved exact source pins referenced by the final composition. The additive `concurrency` envelope requires an endpoint confirmed to enforce guardedCompositionV1; unsupported hosted endpoints refuse it with unsupported_concurrency. Obtain dependency expectations from the observed composition; never rebuild a stale basis from current state. Every committing call REQUIRES `if_match`, the composition ETag from a fresh get_composition, or the `concurrency` envelope; a call with neither is refused with 428 precondition_required. On 409 stale_etag, read get_composition again and reconsider the batch against what changed; never copy the error's currentEtag into a retry without that read. `dry_run: true` validates the batch without persisting and needs no revision. Ops land on the project's ACTIVE composition unless you pass `composition_id` (mutually exclusive with `session_id`), which targets a specific one — that is how you author a second composition minted with new_composition and run an A/B. Use this to seed a composition (add media clips) or make targeted edits (set a crop intent, reorder clips, set the format). CAPTIONS FOR EDITED TIMELINES: after saving all clip edits, call again with {type:"captions.fromComposition", trackId} to build captions from every audible clip on that track, honoring trims, exclusions and placement. Clips must have duration matching playable source duration divided by p

输入参数body必填commandIdprojectId必填

validate_composition

Validate Composition

Dry-run a full Composition object against the SAME pure, DB-free authoring guards saveComposition enforces, WITHOUT persisting it (no project needed). Checks: wire shape (Zod), primitive membership (unknown_primitive / custom_missing_sourcecode), required-param shape (invalid_primitive_params), clip↔track family (clip_source_track_mismatch), and reframe coverage (reframe_coverage_gap). Always returns ONE shape — 200 { valid, errors, quote } — for BOTH malformed wire shapes and deep-invariant failures (so branch on `valid`, not on HTTP status); errors[] lists every problem at once as a sanitized envelope { code, stage, category, retryable, message, fix } you can fix before composing/rendering. The `quote` triple states the render price to finish from a valid composition — relay it to your human BEFORE create_render. `valid:true` means save-safe EXCEPT for the three genuinely DB-bound checks that can only run at save/render, because this tool takes no project: trim-bounds (needs the media duration), image/asset-on-a-video-track (needs the media kind), and componentId resolution (needs the installed components of YOUR org — a `{kind:'component', componentId, props}` clip naming a component you have not created, or naming a CATALOG PRIMITIVE, passes here and is refused at save with `component_source_unavailable`). Pass the Composition as `body`.

输入参数body必填

create_render

Create Render

Queue an MP4 render of a project's composition (in a compose session, the session's scratch). Returns { id (renderId), status, warnings? } — `warnings[]` carries non-fatal advisories (omitted when none). The render themes from the project's brand kit (bind one via create_project / update_project with brandKitId — or PATCH /projects/:id over REST; without one the output is unbranded). Then call wait_job(kind="render", id=renderId, projectId=...) to block until the file is ready and get the download URL, or register a webhook (create_webhook on render.completed — status rides the payload).

输入参数body必填commandIdprojectId必填

preview_frame

Preview Frame

Queue durable still-frame evidence for layout/copy judgment. Returns immediately with {jobId, kind:'preview_frame', status}; then call wait_job(kind="preview_frame", id=jobId) to receive every presigned frame as an image. The immutable snapshot records geometry, layers, warnings, and whether the target was persisted, inline, or session scratch. A still cannot prove motion — use preview_clip or preview_component for animation.

输入参数body必填commandIdprojectId必填

preview_component

Preview Component

Queue a typed preview artifact for ONE org-installed component — ASYNC: returns a jobId immediately; then wait_job(kind="preview", id=jobId). The preview and production compositor consume the same content-addressed component bundle and verified artifact contract. `body.componentId` selects the component; pass `body.params` to render it with props (the mount's `params`); declared manifest slots are bound separately and reach the scene's `assets`, never params. Admission/runtime/capability failures land on the job terminal with sanitized author-fixable messages. Idempotent per immutable render key.

输入参数body必填commandIdprojectId必填

preview_clip

Preview Clip

Render a scoped, cheap MOTION preview — ONLY body.fromSec→body.toSec of the composition (max 60s) at preview quality (capped resolution, lighter encode) through the real render pipeline. THE way to judge motion — a cut, a transition, a component's animation — at full fidelity BEFORE paying for a full render (a still cannot show motion; a full render costs the export). ASYNC: returns a render job; wait_job(kind="render", id=renderId) or a render.completed webhook for the URL. Meters the capture feature, never an exports credit.

输入参数body必填commandIdprojectId必填

score_composition

Score Composition

Queue the durable server-side judge — it snapshots the exact authored target, samples eval beats, captures frames asynchronously, and grades editorial/spatial/brand/caption. Then wait_job(kind="verify", id=jobId) for per-criterion scores, weighted composite, worst-first critique, and checkpointId. `body.composition` is optional (absent ⇒ ACTIVE). Fix the lowest criterion via apply_composition and re-score. Idempotent per immutable snapshot; compose_verify bills only on the guarded success terminal.

输入参数body必填commandIdprojectId必填

consult

Consult

Ask the Director for editing advice on the project's CURRENT composition — it NEVER writes your composition (you stay the decider). Async: returns a consultJobId; then wait_job(kind="consult", id=consultJobId, projectId=...) surfaces the advisory envelope (assessment / proposals / principles / plan). `body.mode`: 'advise' = the planner agent (fast, ~30s-2min) returns a `plan` (framing/cuts/captions/graphics intents) as GUIDANCE you re-author from — no grounded scores, nothing to adopt; 'amend' (default) = the full author→judge→refine loop (minutes) returns a graded `assessment` + a fix candidate you ADOPT via select_candidate with its candidateIndex. ('explore' is coming soon → use amend.) `body.intent` = your goal in plain English; optional `body.focus` (editorial|spatial|brand|caption); `body.ifMatch` binds to your current etag. Use advise for a fast directional nudge, amend for a grounded, adoptable fix.

输入参数body必填commandIdprojectId必填

resume

Resume

Answer the checkpoint packet wait_job reported as awaiting_input (its {checkpointId} — read the packet FIRST with get_checkpoint and relay the stills + money triple to your human). ONE `body.decision` per gate: 'approve' (proceed; comments allowed — they record as taste without gating), 'revise' (the director revises per your `body.comments` [{anchor: {beatId}|{timecodeMs}, verdict: 'approve'|'revise'|'lock', note}] and/or `body.edits`, then RE-PRESENTS this same gate as a new packet — in-job, no new charge; the brief quote states the included revision cycles, beyond them revise is refused 402), or 'abandon' (end the run — the only terminal refusal). 'lock' freezes an element contractually: the director touching it surfaces as a lock_violation verdict on the next packet. On approve/revise the Director rehydrates its warm box and continues; then wait_job again.

输入参数body必填commandIdcheckpointId必填

create_brief

Create Brief

Persist the video's INTENT as a Brief — the Director's rich input contract (spec: the storyboard skill's output lands here). Fields: goal (required), audience, platform, format, durationSec, tone, cta, locale (output language — all on-screen copy + captions), hook, caption, beats[] (each with an editorial intent and optional MOMENT PINNING {mediaId, startSec, endSec} — honored to-the-frame or refused), mustIncludes, captions {styleId, emphasisPhrases} (the big-serif emphasis treatment), motionStyle, seededGraphics (your authored overlay/component/card clips, carried VERBATIM as locked clips — never re-authored), exclusions (hard negatives: graphic kinds the Director must NEVER author + 'no-transitions'), gates {holdAt, autoApprove}. Then compose it: compose with {briefId}. The response carries the QUOTE (compose + estimated render) — relay it to your human BEFORE composing.

输入参数body必填commandId

get_brief

Get Brief

Read a brief by id — the persisted intent plus its current quote (compose + estimated render).

输入参数briefId必填

list_briefs

List Briefs

List briefs. DEFAULT shows human-authored briefs only; kind:"clip" shows the machine-minted clip briefs (suggest_briefs output), kind:"all" shows everything. Each carries its quote.

输入参数kindafterlimitprojectId

get_checkpoint

Get Checkpoint

Read a checkpoint packet — the durable approval unit a held compose pauses at (wait_job reports awaiting_input with {checkpointId, stage, version}). Carries the stage artifact, presigned storyboard stills (REVIEW THE EVIDENCE, not raw JSON), critic verdicts, the money triple {thisStepUsd, jobSpendSoFarUsd, estimatedJourneyTotalUsd} to relay to your human, and the recorded decision once resolved. When the Brief's gates set reviewMode:'hosted' the packet also carries reviewUrl — a browser review page where your human decides directly (relay THAT link instead of raw stills; you learn the decision via checkpoint webhooks / wait_job). Answer an awaiting packet with resume(checkpointId, ...).

输入参数checkpointId必填

list_checkpoints

List Checkpoints

List checkpoint packets newest-first (filter with composeJobId for one run's v1→vN gate history, or projectId). The version stack with per-version status + decisions IS the review history — nothing is deleted.

输入参数afterlimitprojectIdcomposeJobId

update_brief

Update Brief

Edit a brief (partial). REFUSED with 409 while an ACTIVE compose job references it — finish, resume, or abandon the job first (the Director never has its input edited mid-run). Edits apply to the NEXT compose.

输入参数body必填briefId必填commandId

delete_brief

Delete Brief

Delete a brief. Compose jobs already run from it are unaffected (they snapshot).

输入参数briefId必填commandId

select_candidate

Select Candidate

Select one candidate from a finished compose/consult ensemble as the project's saved composition (whole-candidate replace). Body REQUIRES both fields: { candidateIndex, selectStrategy: "agent-authoritative" } — candidateIndex from wait_job(kind="consult") proposals (mode=amend) or the compose winner report; selectStrategy is required and API keys must use 'agent-authoritative' (editor-merge/editor-replace need an editor-session token and 403 on an API key). agent-authoritative replaces the saved composition unconditionally and ignores ifMatch, so read get_composition first and adopt only when no edit made since the consult or compose must survive. After selecting, render with create_render.

输入参数body必填commandIdprojectId必填composeJobId必填

create_component

Create Component

Create and store a custom component for the tenant: a native scene that arranges its declared images and videos as tiles in 3D space. Returns the ComponentResponse (id + metadata) you can then reference from a composition. No project arg — components are tenant-scoped. SOURCE CONTRACT (version 4; the server instructions' Component Contract has the full rules and an example): send the complete source object {version:4, componentId, template, manifest, definition}. `template` is one sub-composition: a root <div id="root" data-composition-id="<componentId>" data-width data-height data-no-timeline data-composition-variables='…'> holding <div data-cf-scene></div>, and one inline script ending in __cfScene.mount({ root: document.getElementById('root'), component, variables: __hyperframes.getVariables() }). data-composition-variables is the definition's projection (scalar inputSchema properties, then manifest slots). The manifest is {version:4, runtime:'hyperframes', hfContract:1, kind:'scene', assets, graphics:{api:'webgl2',…}, alphaPolicy}; slots are image or video. The source is admitted before it is stored: template lint, determinism (no timers, Date, network or CSS animation) and the declaration are checked, and a refusal names the rule. A version-3 source is retired and refused as component_source_retired. Place it with execution {version:4, componentId, sourceVersionId, params, seed, assets:{ slot: mediaId }} and placement {version:3, kind:'clip'}; slots never travel in params.

输入参数body必填commandId

list_catalog

List Catalog

Use projection:'component-library' for the unified source-free library page, returned as complete JSON with exact scoped definition/preset/recipe cards and pagination. Choose origin:'builtin' for the maintained builtins or origin:'library' for the authenticated serving home; use libraryKind, category, q, limit and after to filter/page. Preserve each card identity.scope and identity.revision, its source/definition pin or exact recipe document identity; same names/IDs in different scopes remain distinct. Resolve the selected exact source with sourceVersionId (plus builtinCollection for an explicitly selected builtin), never a latest-head or another-home lookup. Presets identify their exact presetVersionId, definition pin and historical document witness; recipes identify their complete exact document and member source pins. This projection contains no source bodies or legacy thumbnail substitution. Omit projection for the historical catalog protocol below. DISCOVER WHAT TO BUILD WITH — list the component catalog: the one built-in primitive (heroText, the behind-subject overlay) plus your org-installed components. Desktop also includes bundled kind:'component-package' entries: these are complete reusable authored packages; insert them with the desktop apply_template tool using placement.template and explicit insert.startTime/idPrefix, media bindings and parameter values. Do not pass their ids to clip.add, get_component_source, or cueframe://component resources. Their draft status does not certify visual review or licensing. For hosted builtin preset/recipe cards, call resolve_builtin_component with the exact collection, id and revision, then apply_template with template:<builtin id> and body:{projectId,documentSha256,insert:{startTime,idPrefix},...}. Hosted tool request fields live under body; desktop tool shapes may differ. The agent-safe default page is 20 entries; use pagination.nextCursor as `after`, or narrow with category, kind, tier, useCase, mood, q, or intent.

输入参数qkindmoodtierafterlimitintentoriginuseCasecategoryprojectionlibraryKind

resolve_builtin_component

Resolve Builtin Component

Resolve a selected builtin component-library card using its exact collection, id and revision. Returns the canonical pinned document and source snapshots for a preset or recipe, or the exact source for a definition. Preserve documentSha256 and all identities; a missing revision refuses without falling back to another version or scope. Resolve before apply_template; do not invent wrapper source or reconstruct a package from a thumbnail.

输入参数id必填revision必填collection必填

list_templates

List Templates

List this organization's saved templates. Follow pagination.nextCursor with after to read further pages. Public catalog slugs are not enumerated here; read a known public slug with get_template.

输入参数afterlimit

get_template

Get Template

Read a saved organization template by id or a known public catalog template by slug. The answer is a summary: the media and value parameters with their kinds and options, presets with their values and brand kit, the brand kit, rubric, components (id, version, asset slots) and an outline of the tracks and clips; never component sources (read one with get_component_source, or pass full: true for the whole document). Use the exact reference with start_template or apply_template. Do not invent a slug from a component-library card.

输入参数fulltemplate必填

apply_template

Apply Template

Insert a resolved builtin component package into an existing project. Pass template as the selected builtin id and body with projectId, the resolved documentSha256, insert:{startTime,idPrefix}, parameter values and explicit media bindings. Read get_composition first and retain expectedRevision, commandId, componentExecutionVersions:[3,4] and expectedBrandIdentity as required by the contract. Insertion preserves existing timeline content and package source offsets. Select pinned samples explicitly with media:{slot:{sample:true}}, or bind real media IDs. Missing required media is refused; samples are never selected implicitly. A stale revision, pin or brand refuses; do not silently refresh the witness. For ordinary templates, this operation retains its existing apply behavior.

输入参数body必填template必填commandId

get_component_source

Get Component Source

Read an exact component source as complete JSON. Supply sourceVersionId from the selected catalog card to read that immutable revision, retaining sourceSnapshot with its complete versioned definition, manifest and template beside its exact pin and schema metadata. For an explicitly selected builtin, also supply builtinCollection:'native'|'curated-definitions' and its exact sourceVersionId; without builtinCollection resolution is scoped to the authenticated org. An unavailable exact pin refuses; never retry a head or another scope. To fork, keep the version-4 snapshot whole, change its componentId (the template root's data-composition-id too) and template, and send it to create_component. Builtins always require an exact collection and pin; ID-only builtin reads are refused. Declared slots are bound per placement in execution.assets, never caller params.

输入参数componentId必填sourceVersionIdbuiltinCollection

get_media_context

Get Media Context

Fetch bounded authoring context for a media item: dimensions/thumbnail, compact face roster, transcript counts/sample, temporal grids, and fact readiness. Transcript and word-grid counts cover one page only (default 20 utterances); pass transcript.data.pagination.nextCursor as after to get_media_context for the next context page, or use get_transcript for exact paginated word timings.

输入参数afterlimitprojectIdmediaItemId必填

get_transcript

Get Transcript

Read exact source-time transcript words in bounded utterance pages. Word start/end values are seconds from the source media start. Default limit is 20; pass pagination.nextCursor as after for later pages. The formatter omits the unbounded fullText duplicate.

输入参数afterlimitbeforemediaItemId必填

prepare_media

Prepare Media

Prepare the perception artifact an authored edit needs BEFORE sighted review. Pass body.kind="subjectTrack" for face/active-speaker reframing, or body.kind="matte" for a true zPlane:"behind-subject" graphic. Pass body.intent {startSec,endSec} using SOURCE time (the media trim, not timeline time); it is required for mattes and strongly recommended for subject tracks so the prepared fact exactly matches the clip and quote. This is the supported product path — never accept a preview that silently flattens depth or ignores speaker tracking. Returns a fact receipt; with intent, poll get_media_facts using the same kind/window until exact.state is ready; without intent, omit all three filters and find the whole-source subjectTrack in facts until status is ready (failed is terminal). Existing pending/ready facts are reused without another charge.

输入参数body必填commandIdmediaItemId必填

get_media_facts

Get Media Facts

Read prepared subject tracks and behind-subject mattes for one media item. For an exact readiness check, pass kind + startSec + endSec together using the same SOURCE window sent to prepare_media; exact.state is pending | ready | failed | available | unavailable. If subjectTrack was prepared without intent, omit all three filters and check the whole-source subjectTrack in facts instead. Wait for the required fact to be ready before preview_frame / score_composition.

输入参数kindendSecstartSecmediaItemId必填

list_media

List Media

List the media in your CueFrame library. Filter a real library with kind (video|audio|image|gif|asset|source|stock), source (upload|generated|import-url|stock), or tag — so you find YOUR footage, not e2e debris. Returns media item IDs and metadata; use an ID with get_media_context, suggest_briefs, or as a composition source.

输入参数tagkindafterlimitsourceprojectId

download_media

Download Media

Get a presigned download URL for a media item's stored SOURCE file — the bytes CueFrame composes from (the raw upload, or its conformed transcode). This is how you copy media OUT of a library: fetch the URL directly (no auth header) and PUT the bytes elsewhere with create_upload, or hand it to import_media on another account. Works as soon as the upload or import is stored, before processing completes. The URL expires at `expiresAt` (about an hour) — call again for a fresh one rather than caching it. Read-only and free; nothing is persisted. For a render's MP4 use refresh_render_url instead.

输入参数projectIdmediaItemId必填

get_render

Get Render

Read ONE render's record without waiting on it: status, progress while it runs, outputUrl + outputExpiresAt once complete, the typed failure (errorCode / category / retryable) if it failed, and WHAT RENDERED — compositionId (the composition it froze), format (aspect/fps/resolution it encoded at), engine, createdAt / completedAt, outputDurationSec, and the preview window for a preview_clip. Free, read-only, instant — use it to audit or correlate a past render (which composition, when, how long) where wait_job would block; wait_job remains the way to block until a running render finishes. An expired outputUrl is refreshed with refresh_render_url.

输入参数renderId必填projectId必填

refresh_render_url

Refresh Render Url

Re-sign a COMPLETE render's output URL. A render's presigned MP4 link lasts ~7 days, so wait_job / getRender on an old render hands back a link that 403s; this mints a fresh one for the same file and returns { outputUrl, outputExpiresAt }. Needs projectId + renderId (from create_render). 422 render_not_complete while the render is still running or failed — wait_job for it first. Requires renders:write (the row's stored URL is updated).

输入参数renderId必填commandIdprojectId必填

create_project

Create Project

Create a new project — the unit you compose and render into. compose / apply_composition / create_render / the preview family all require a projectId; this mints one. Pass name (required) plus optionally a format (aspectRatio/fps/resolution) and brandKitId. brandKitId binds a brand kit to the PROJECT (pass the kitId from create_brand_kit): colors/fonts/motion theme every render of this project automatically (omit it and the output is unbranded). Bind or change it later via update_project (PATCH /projects/:id over REST). Returns the ProjectResponse (id + metadata).

输入参数body必填commandId

new_composition

New Composition

Create a NEW composition (a new video) inside a project — a project is a workspace that holds many videos. Returns { compositionId, format, etag }. Pass an optional name and format (aspectRatio/fps/resolution); format defaults to the project's compositionFormat. The first composition becomes the project's active default. To author it, seed with apply_composition then compose({ fromComposition: true }) — your authored graphics ride as locked clips, carried verbatim; to render a specific one, pass its compositionId to create_render. (For a reframed sibling in another aspect, use derive_composition.)

输入参数body必填commandIdprojectId必填

get_composition

Get Composition

READ BACK a composition as JSON — the edit itself: tracks, clips, card HTML, reframe segments, captions, markers, format. This is what create_render encodes, so it is also what you hand to validate_composition (which needs a full inline composition body), what you diff after an edit, and what you archive/share so someone else can re-render the SAME video. Read-only and free. Authoring stays op-based (apply_composition) — do not round-trip this object back as a write. A composition too large to fit one MCP result degrades to a STRUCTURAL SUMMARY (every track and clip still listed; card html and caption words elided as lengths) with a header saying so — read it over REST if you need the verbatim body. Defaults to the project's ACTIVE composition; pass `compositionId` to read a specific one (the same id apply_composition takes as `composition_id`, and preview_frame / create_render take as compositionId) so an A/B variant can be read back, not just written. The result includes the exact HTTP etag string; copy it to apply_composition.body.if_match (the numeric revision is not an ETag). In a compose session this reads the session's scratch, the composition its edits, previews and renders target. Pass includeDependencies="true" on a v1 guarded endpoint to read composition_id, revision and dependency tokens. With componentExecutionVersions=["3","4"], this envelope also returns expectedBrandIdentity from the persisted project authority; carry it unchanged into the matching negotiated write. Preserve those observed tokens when authoring; never refresh the basis to hide a conflict. BOTH shapes carry `needsUpgrade` when clips are stored in a retired form (unpinned or TSX component placements, removed primitives): each entry names the clipId, the kind and, when one exists, the native successor pin — move those with repin_component and rebuild the rest with create_component; such a composition will not save or render as-is. Absent when nothing needs upgrading.

输入参数projectId必填session_idcompositionIdincludeDependenciescomponentExecutionVersions

list_compositions

List Compositions

List every composition (video) in a project, with its format and which one is active. Use a returned compositionId with create_render(compositionId=...) to render a specific video, or apply_composition to edit it.

输入参数projectId必填

delete_composition

Delete Composition

Delete a composition (and its version history) from a project. REFUSES the ACTIVE composition (409) — make another one active first, or delete the project. Use list_compositions to see which is active.

输入参数commandIdprojectId必填compositionId必填

list_projects

List Projects

List your projects — re-orient in an existing workspace instead of minting duplicates (steady-state entry, A9). Each row carries the id every other tool needs.

输入参数afterlimit

derive_composition

Derive Composition

Derive a reframed SIBLING composition for a different aspect ratio (the agent-native Auto-Reframe / Magic-Resize). Pass projectId + body { fromCompositionId, targetFormat: { aspectRatio, fps?, resolution? } }. CueFrame copies the source composition's authored intent and content-aware-reframes every clip for the new aspect (point/face/active-speaker focus), then saves a new independent composition in the same project. Returns { compositionId } — render it with create_render, or refine it with apply_composition. Use this to make 9:16 + 1:1 + 4:5 cuts from one 16:9 edit. (To only change resolution within the SAME aspect, pass create_render.format instead — that is a scale-only export override, not a new composition.)

输入参数body必填commandIdprojectId必填

import_media

Import Media

Import a media item into your library from a public URL — the agent-friendly ingest path (single call, no upload protocol). Pass url (https) + filename (+ optional contentType). Returns { id, status:"importing" }. Processing is async: call wait_job(kind="media", id=mediaItemId), or register a webhook (create_webhook on media.completed — status: complete|failed rides the payload). Use the returned id with get_media_context, suggest_briefs, or as a composition source.

输入参数body必填commandId

generate_media

Generate Media

Generate one first-class Library media item from a prompt. Choose generator: text-to-video | text-to-image | image-to-video | text-to-music | text-to-speech | text-to-sfx | auto. Put supported presentation controls in body.style and first/last/image references in body.refs. Returns { id, status:"generating", estimateUsd? }; returns 402 if the estimate exceeds the per-call ceiling. Async — call wait_job(kind="media", id=mediaItemId) or use a webhook (media.completed — status rides the payload). Use the returned id like any other media item.

输入参数body必填commandId

create_upload

Create Upload

Ingest a LOCAL file — bytes you hold, when there is no public URL to hand import_media (prefer import_media whenever the bytes already sit at an https URL). TWO steps: (1) this tool reserves a media item and returns { id, uploadUrl, expiresAt } — a short-lived PUT URL. PUT the raw file bytes to uploadUrl over HTTPS with your declared Content-Type (≤ ~5 GB per PUT). (2) call finalize_upload({ mediaItemId: id }) to start processing. Body: filename, contentType (allowed enum), size (bytes). Thereafter it is async exactly like import_media: poll list_media for processingStatus, or register a webhook (create_webhook on media.completed). Use the returned id with get_media_context, suggest_briefs, or as a composition source.

输入参数body必填commandId

finalize_upload

Finalize Upload

Finalize a direct upload once you have PUT the bytes to the uploadUrl from create_upload. Confirms the bytes landed and starts ingest: image/asset become ready immediately (status "complete"); audio/video enter processing (status "processing"). Returns { id, status, processingPhase }. 400 if no bytes were uploaded (PUT first) or the item is not yours. Then call wait_job(kind="media", id=mediaItemId), or use a media.completed webhook.

输入参数body必填commandIdmediaItemId必填

search_resources

Search Resources

Search licensed stock media to compose with across video, photo, sound effects, and GIFs. Pass query for ONE search, or queries[] (≤10) to run them all in a SINGLE call — strongly prefer the batch when you know several things you need. A batch returns results[], one per query in order, each with its own candidates; a query that fails carries an error and never discards the others. Optional kind [default video], provider pin, and limit ≤50 apply to every query in the batch. Returns ranked candidates, each with an opaque candidateId + attribution (author, assetUrl) + license, and a preview URL in the text. FREE + rate-limited + cached — reach for this before generate_media when real footage beats synthesis. TO SEE the candidates rather than read about them, pass limit ≥2: thumbnails/audio are attached only when you asked for options to compare. Import a chosen candidate into a project with import_resource. Candidate handles expire; re-search to refresh one.

输入参数body必填

list_render_fonts

List Render Fonts

The fonts the RENDERER can actually draw — read this BEFORE authoring type, not after a refusal. Per family: the exact family name authoring accepts, the weight RANGES a shipped file declares (a static face has min===max; a variable face gives its axis range), the caption default weights, and whether the bytes are bundled or an aliased metric-compatible stand-in. Anything listed here passes validation by construction: it is derived from the same table the font gate refuses by. Two facts worth reading off it — every family's `styles` is ["normal"], because NO bundled family ships an italic FILE (a real italic comes only from a brand-kit font asset), and a weight outside every range is REFUSED, never synthesised. Contrast search_fonts, which searches the GOOGLE catalog and will happily return families the renderer cannot draw. `manifestVersion` identifies this exact face table; record it beside a composition to state what a font choice was validated against. Covers the bundled set only — a brand kit's sealed faces are per-org and per-render. No args, read-only, free.

无需输入参数。

search_fonts

Search Fonts

Search web font families by name/style — returns family names to use in composition/component params. Pass query (+ optional perPage ≤50). Read-only + free; surfaces the Google Fonts catalog (family + category + variants + css2 stylesheet URL). IMPORTANT: this searches the GOOGLE catalog, not what the render can actually draw. Only the faces vendored into the render page are guaranteed to rasterize; naming any other family gets you the generic fallback (Liberation Sans) with no error. Call list_render_fonts for the set you may actually choose from, WITH the admitted weights per family — treat that, not this catalog, as the list. An empty result set here means no match, or the upstream catalog was unavailable.

输入参数body必填

import_resource

Import Resource

Import a stock candidate (candidateId from search_resources) into a project as an ORG-OWNED media item — provider/externalId/license provenance preserved, bytes deduped across orgs. Pass projectId + candidateId. Returns { id, status:"importing"|"ready" }; processing is async — call wait_job(kind="media", id=mediaItemId), then use the returned id as a composition source. Gated on the resource_import plan feature (402 billing_required if your plan lacks it). COST: 0 credits — search and import are both free for a keyed caller (get_account → entitlements.resource_import.listUsdPerUnit is 0); imported bytes count toward the storage gauge. 422 candidate_mismatch if the candidate expired — re-run search_resources.

输入参数body必填commandId

suggest_briefs

Suggest Briefs

Run AI clip-suggestion analysis on a long-form media item — the CLIPPING path (find the best short-form moments). Returns { status, alreadyRunning? }; then wait_job(kind="suggestions", id=mediaItemId) — its terminal lists each suggestion WITH its briefId. When the media belongs to a PROJECT, each finalized suggestion is promoted to a kind-'clip' BRIEF (its window pinned as a beat) — list_briefs {kind:"clip"} shows them and compose({ briefId }) runs the flagship path from one. Project-less media: pass the suggestion id to compose({ suggestionId }) directly. Clipping is a vertical, NOT the general path.

输入参数commandIdmediaItemId必填

create_webhook

Create Webhook

Register a webhook so long-running jobs notify you instead of blocking on wait_job — the right pattern for fan-out/async agents. Pass url + events — ONE terminal event per job kind with status INSIDE the payload (render.completed, compose.completed, media.completed, suggest.completed) plus checkpoint.ready (a held compose paused for review). DELIVERY: a POST { event, timestamp, projectId?, data } with Standard-Webhooks headers (webhook-id, webhook-timestamp, webhook-signature: v1,<base64>); the secret (whsec_<base64>) is returned ONCE — verify the RAW body with new Webhook(secret).verify(rawBody, headers). ACTIVATION is synchronous: CueFrame POSTs a signed webhook.verify challenge and your endpoint must reply 2xx echoing data.token — otherwise it returns status:"pending" and receives NO events (recover with verify_webhook, no delete/recreate). Read the cueframe://webhook-events resource (or GET /webhooks/events) for the full contract + every event's data shape BEFORE building your receiver.

输入参数body必填commandId

verify_webhook

Verify Webhook

Re-run ownership verification on a PENDING webhook — one whose endpoint did not echo the challenge at create time (check its verification.reason: token_not_echoed / non_2xx_<code> / unreachable / ssrf_blocked). After you fix the receiver to reply 2xx echoing data.token, call this to re-send the signed webhook.verify challenge and flip it active IN PLACE (id + secret preserved — no delete/recreate). Returns { id, status:"active"|"pending", verification? }. An already-active webhook returns active unchanged.

输入参数commandIdwebhookId必填

get_profile

Get Profile

The org's legible taste in ONE read: brand kits, registered critics (the machine-checkable standard both the Director's gates and score_composition enforce), their reference media (presigned thumbnails), the recent checkpoint-decision log, and the learned `taste` (style preferences saved with remember_taste). Read this BEFORE composing for an org you haven't worked with — it is the house style. Learned taste is advice: the current request, brief, project, brand kit, exclusions and critics take precedence; name any conflict.

无需输入参数。

list_critics

List Critics

List registered critics: criticId, label, tier (rules|rubric|evaluator), phase, floor, referenceMediaIds. Rubric text / rules / evaluator URLs are write-only — never echoed. Manage with register_critic (upsert) / delete_critic.

无需输入参数。

delete_critic

Delete Critic

Delete a registered critic by its criticId. It stops running in the Director gates and score_composition immediately.

输入参数criticId必填commandId

remember_taste

Remember Taste

Save one durable style preference to the org's learned taste, with its source (the job, checkpoint or chat, plus the date). Only for a preference the user stated: a revise comment, a chat correction or an explicit "remember this"; never one-off brief content, footage facts or secrets. Tell the user what you saved and that they can say undo (forget_taste). Saving text the org already holds changes nothing. Refused, never truncated, past 2,048 bytes per entry or 4,000 characters per org, or while the owner has learned taste off; a refusal is final. get_profile returns the saved entries as `taste`.

输入参数body必填commandId

list_taste

List Taste

Read the org's learned taste: whether the owner has it on (`enabled`) and its saved entries, oldest first. While `enabled` is false, do not apply the entries. Learned taste is advice: the current request, brief, project, brand kit, exclusions and critics take precedence.

无需输入参数。

forget_taste

Forget Taste

Delete one entry from the org's learned taste by its id (from get_profile `taste` or remember_taste). This is how the user's "undo" works.

输入参数tasteId必填commandId

register_critic

Register Critic

Register a custom eval into the compose critic panel — the critic contract is { rubric (or rules/evaluator), referenceMediaIds?, floor }. Three tiers: rules (declarative constraints — keep-out regions, required elements, max overlays, brand colors), rubric (a text criterion scored by the judge as an extra column), or evaluator (your HTTPS webhook — CueFrame POSTs the composition+stills+facts, you return { score, critique }). referenceMediaIds (≤6 org media ids) attach YOUR reference frames as the standard — the judge scores candidates for consistency with them, so "indistinguishable from mine" is a machine check. Lane scope: rules + rubric critics run in BOTH lanes (the Director's gates AND standalone score_composition); evaluator webhooks run in the Director lane only. Use phase 'static' (the default) — 'temporal' (final-render evaluation) is accepted but not yet wired, so a temporal critic produces no verdicts today. A low client score drives a refine like a built-in criterion. You see your eval output + our scores, never our rubric. Re-registering the same criticId upserts (list_critics / delete_critic manage the set). Evaluator tier returns a signing secret ONCE.

输入参数body必填commandId

update_project

Update Project

Update a project's mutable fields (e.g. name, format, brandKitId). Pass projectId + the changed fields as `body`. Setting brandKitId binds/changes the project brand kit so every render of this project themes from it. Returns the updated ProjectResponse.

输入参数body必填commandIdprojectId必填

delete_project

Delete Project

Permanently delete a project you created (cleanup). Removes its composition and render history. Irreversible — only call on a project you own and no longer need.

输入参数commandIdprojectId必填

delete_media

Delete Media

Permanently delete a media item from your library (cleanup). Irreversible. Compositions referencing it will fail to render — only delete media no composition still needs.

输入参数commandIdmediaItemId必填

update_component

Update Component

Update an authored component's complete version-4 source/metadata IN PLACE (same id) — the correct verb for the author→preview→fix loop (preview_component returns the admission or runtime error; fix the template here and re-preview, instead of creating a new component each iteration). Pass componentId + the changed fields as `body`. Same source contract as create_component: {version:4, componentId, template, manifest, definition}, admitted before the write; the template finds its root with document.getElementById('root'), and declared slots arrive in the scene's `assets`, never params. PLACED CLIPS: every placed clip renders the exact version it pins, so an update moves placed clips ONLY when you name a project — put `projectId` (and optionally `compositionId`; default the project's active composition) in `body`, and that composition's placements move to the new version in the same write. The answer carries `repinned` (what moved) and `placementsPinnedToPrevious` (placements across the org still rendering the previous version). Without `projectId` nothing placed moves: previews and renders of an existing clip keep the old version. For one placement, register the source WITHOUT projectId, read its immutable sourceVersionId, then use apply_composition clip.update to change only the selected clip source and exact pin under observed concurrency expectations. Explicit-project update_component admits and repins all matching placements in that composition; use it only when that broader edit is requested.

输入参数body必填commandIdcomponentId必填

repin_component

Repin Component

Move clips stored in a retired form to their native (version 4) successors: a clip pinning a retired TSX (version 3) component, or one stored before execution pins (`needsUpgrade` kind `unpinned-component`), moves to the `successorSourceVersionId` that get_composition's `needsUpgrade` (or a `component_source_retired` refusal) names. Pass projectId and, in `body`, optional `clip_ids` (omit them to move every clip that has a successor) and `composition_id` (the active composition when omitted). Saved inputs are kept. The answer lists `moved` and `withoutSuccessor`; rebuild the latter as native components (create_component, then apply_composition at the same timing and placement). A retired clip with no successor must be rebuilt or removed in the same write that upgrades the others: a write never leaves one in place.

输入参数body必填commandIdprojectId必填

update_webhook

Update Webhook

Update a webhook subscription (its url or event list). Pass webhookId + changed fields as `body`. The signing secret is NOT rotated here.

输入参数body必填commandIdwebhookId必填

delete_webhook

Delete Webhook

Delete a webhook subscription (stop receiving its deliveries). Irreversible — the signing secret is invalidated.

输入参数commandIdwebhookId必填

cancel_render

Cancel Render

Cancel an in-flight render (stop a runaway/queued job). Needs projectId + renderId (from create_render). No-op if already terminal.

输入参数renderId必填commandIdprojectId必填

cancel_compose

Cancel Compose

Cancel an in-flight compose job (stop a runaway/mis-priced ensemble). Needs projectId + composeJobId (from compose). The director cancel is confirmed before the row flips; any linked charge is released. No-op-reject (422) if already terminal.

输入参数commandIdprojectId必填composeJobId必填

cancel_job

Cancel Job

Cancel a running async job (verify / preview / brand-kit-extract) returned by an enqueue call — abort a mis-priced job instead of waiting out its TTL. For box-backed jobs the warm box is reaped best-effort; cancel never meters. No-op-reject (422) if already terminal.

输入参数jobId必填commandId

cancel_export

Cancel Export

Cancel an in-flight NLE export (fcpxml/premiere). Needs projectId + exportId (from the export enqueue). No-op-reject (422) if already terminal.

输入参数exportId必填commandIdprojectId必填

retry_render

Retry Render

Re-render an existing render job's FROZEN composition snapshot — it inherits that job's exact composition/intent/priority and queues a fresh renderJob; it does NOT re-read the project's current composition. So it only helps a TRANSIENT failure (the failed render's `retryable:true` / `category:"transient"` — a flaky pipeline/infra fault): re-attempting the same snapshot may succeed. For a DETERMINISTIC failure (`retryable:false` / `category:"authoring"` — a bad param, an unresolvable media/brand ref), retry_render reproduces the SAME failure: FIX the composition first via apply_composition, then create_render (a retry alone is futile). Check `retryable` on getRender / wait_job to pick the path. Returns the new render; then wait_job(kind="render", id=<new id>).

输入参数renderId必填commandIdprojectId必填

get_account

Get Account

ORIENT FIRST — show THIS key's account before you spend a metered call: the org it is bound to, the current plan, a per-feature entitlements map, and per-call cost ceilings. READ `balance`, NOT `included`. CueFrame is credit-funded: rendering (entitlements.exports), generation (generate), preview stills (compose_capture), the judge (compose_verify) and the Director (compose) have NO separate per-plan allowance — they all spend one shared wallet, named in `fundedBy` (`credits`; generation is metered in provider-cost units against that wallet). Each `balance` restates that ONE wallet in that feature's own unit at `creditCost` credits per unit, so they are alternative ways to spend the same money, not four budgets. Each entitlement also carries `listUsdPerUnit`: the dollar quote for ONE unit before you call (0 = a plan grant that draws no credits, e.g. resource_import — stock search + import are free; null = not quotable up front). Check the requested cost against the balance. For generation, also check generationLimit: free accounts have a separate provider-cost cap even with a positive wallet. A billing_required error with reason free_generation_cap requires a credit-pack purchase through normal checkout. `included:false` means the plan genuinely lacks the feature. Every new org starts with a free credit grant, so an account with an empty usage history can still render, generate, preview and score. costCeilings.generateMediaUsdPerCall is the generate_media per-call USD cap. No args — identity is resolved from your key (never echoed from input).

无需输入参数。

list_plans

List Plans

List the plan catalog (tiers, intervals, product ids, prices) BEFORE a checkout, so create_checkout requests a real {plan, interval} instead of guessing an id. No args — reads the platform catalog.

无需输入参数。

get_usage

Get Usage

The A2 usage ledger: every metered billing event newest-first with attribution — featureId, amount, the project/job that produced it, and the event's LIST price in USD (a plan allowance may zero it on the invoice). Answer "what did project X cost this period?" with a query instead of summing your own quotes. Filter by projectId, jobId, and/or a [from, to) epoch-ms window. Requires the billing:read scope.

输入参数tofromafterjobIdlimitprojectId

create_checkout

Create Checkout

Top up the CURRENT org's credit wallet. Body { plan: "credit_pack_10"|"credit_pack_30"|"credit_pack_100" } → returns { url }: a hosted Stripe checkout page to open in a browser and confirm payment. There are no subscription tiers — a pack is a one-off top-up, and it is also the only thing that raises the generation (premium_credits) allowance. Always a URL — an existing saved card is NEVER charged silently; the human confirms on Stripe. The org is resolved from your key, never the body. Requires the billing:write scope. Only send a user here when get_account shows the relevant `balance` at or near zero. Discover the packs with list_plans.

输入参数body必填commandId

create_brand_kit

Create Brand Kit

Create or UPSERT a brand kit (re-POSTing the same kitId updates it in place — this is also the brand-kit UPDATE path). Sets fonts/colors/logo. This is brand step 0 of the workflow: author the kit, then bind it to a PROJECT so colors/fonts/motion theme the output AUTOMATICALLY — pass its kitId as brandKitId to create_project, or attach it to an existing project via update_project (PATCH /projects/:id over REST). Without a bound kit, create_render produces UNBRANDED output. Tenant-scoped (no project arg).

输入参数body必填commandId

extract_brand_kit

Extract Brand Kit

Queue brand-token extraction from a website URL — ASYNC: returns a jobId immediately; then wait_job(kind="brand_kit_extract", id=jobId) for the tokens (colors/fonts/title/description, fetched + regex-parsed from the site's HTML/CSS — NOT a screenshot/vision pass). It does NOT persist — review the tokens, then call create_brand_kit to save a kit. A blocked (private/SSRF), non-2xx, non-HTML, or slow (>20s) URL degrades to EMPTY token arrays (a succeeded job) rather than erroring — JS-rendered SPAs typically extract empty; author the kit manually from the compiled CSS in that case.

输入参数body必填commandId

describe_composition_ops

Describe Composition Operations

Discover the exact CompositionOp vocabulary accepted by apply_composition. Omit type for a compact list of operation names and descriptions; pass type for only that operation's JSON Schema. Read this before authoring edits or captions.

输入参数type

start_template

Start from Template

Create a new project from a catalog or org template. The server prepares media and verified mattes before the project is ready. Pass the returned jobId to wait_job(kind="template").

输入参数mediapresetvaluestemplate必填commandIdbrandKitIdprojectName必填idempotencyKey

wait_job

Wait for Job

Wait for a long-running job and return the resolved result — a bounded long-poll. Includes template preparation (kind="template", id=jobId), media import, render, compose, consult, suggestions and preview. If still running, call wait_job again with the same arguments; work continues server-side.

输入参数id必填kind必填projectIdtimeoutMs

preview_card

Preview Card

Render ONE authored card on its own and SEE it, before placing it in a composition. Pass the same `html` (+ optional `tokens`) you would put in a {kind:"card"} clip; you get the still back as an image. Use this while writing a card — it is the fast loop for catching type that overflows the frame, a headline that collides with a logo, or tokens that did not resolve. Sized to the format you name, so what you see is what that aspect ratio will show. To judge MOTION rather than layout, shell the card with a motion preset and use preview_clip.

输入参数html必填tokenscommandIdprojectId必填aspectRatio

版本历史

2
  1. v1.2.0最新Oct 10, 2026
  2. v1.1.0Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分