cuttingfloor について
cuttingfloorは、エージェント向けのヘッドレス動画エディターで、MCPサーバーとして編集、字幕、音声、エフェクト、プレビュー、書き出し機能を提供します。編集ごとに新しいタイムラインIDとプレビューを返し、タイムラインは不変です。ローカル実行にはDockerを使います。
主な機能
- 01メディアの取り込みと複数トラック編集
- 02カット、トランジション、字幕、音声調整
- 03エフェクト、合成、モーショングラフィックス
- 04フレームプレビューと品質チェック
- 05動画、音声、編集タイムラインの書き出し
活用シーン
- 01文字起こしの単語単位でのカットと字幕追加
- 02映像、音量、無音区間の確認
- 03縦型ソーシャル動画の作成と書き出し
- 04タイムラインの他の動画エディターへの受け渡し
MCP 対応
Streamable HTTPまたはstdioで、動画編集ツールをMCPクライアントに提供します。メディアの取り込みと分析、タイムライン編集、プレビュー、品質チェック、書き出しに対応し、編集ごとに新しいタイムラインIDを返します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://api.cuttingfloor.ai/mcpclaude mcp add --transport http mvp2o-ai-cuttingfloor https://api.cuttingfloor.ai/mcp{"mcpServers":{"mvp2o-ai-cuttingfloor":{"type":"http","url":"https://api.cuttingfloor.ai/mcp"}}}Cursor で開く{"servers":{"mvp2o-ai-cuttingfloor":{"type":"http","url":"https://api.cuttingfloor.ai/mcp"}}}VS Code で開く{"mcpServers":{"mvp2o-ai-cuttingfloor":{"type":"http","url":"https://api.cuttingfloor.ai/mcp"}}}{"mcpServers":{"mvp2o-ai-cuttingfloor":{"serverUrl":"https://api.cuttingfloor.ai/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
cuttingfloor
エージェント向けのヘッドレス動画エディターを、MCP サーバーとして提供します。エージェントは素材を読み込み、細かな編集ツールでタイムラインを編集し、編集のたびに結果を確認し、チェックしてからファイルをエクスポートします。
- 編集のたびに新しいタイムライン ID と、結果のプレビュー画像が返されます。 タイムラインはイミュータブルなので、以前の ID を使うだけで元に戻せます。
- データは保存されません。 タイムライン、メディア、出力は有効期限付きのキャッシュに保存されます(タイムラインは24時間、メディアとエクスポートは7日間)。作業を残すにはエクスポートしてください。
- 1つの Docker イメージでローカル(無料)とホスト環境の両方で動作します。エンジン(FFmpeg、MLT)もイメージに含まれており、インストールが必要なのは Docker だけです。
ステータス:フェーズ3を進行中です。読み込み、タイムライン、クリップ編集、タイミング(速度、ランプ、逆再生、フリーズフレーム、ロール/スリップ/スライド、範囲抽出、ネストされたタイムライン)、トランジション、タイトルと字幕、オーディオ(ゲイン、パン、フェード、ダッキング、ラウドネス)、エフェクト(カラー、LUT、ぼかし、クロマキーなど、EQ、コンプレッサー、ノイズ除去、ピッチ)、解析(文字起こし、ビート、顔、トラッキング)、コンポジット(変形、キーフレーム、マスク、ブレンドモード、アニメーション)、モーショングラフィックスと HTML 静止画(サンドボックス化)、マット、単語ごとのタイミング情報付きローカルナレーション、人物の切り抜き、プレビュー、正確な QA チェック、H.264/ProRes エクスポートが一通り動作します。プロバイダーツール(ElevenLabs、OpenAI)と NLE との相互運用機能は次に対応予定です。
実行する
docker compose up -d # local mode: one node on 127.0.0.1:8787, plus the motion sandbox
Compose は同じイメージから2つのコンテナを起動します。cuttingfloor(サーバー)と、エージェントが作成した create.motion および create.still 用の HTML をレンダリングするサンドボックス cuttingfloor-motion です。サンドボックスには外部への経路がなく、データボリュームもなく、機能もなく、ファイルシステムは読み取り専用で、CPU、メモリ、プロセス数に固定の上限があります。Chromium 独自のサンドボックスは、tools/motion/seccomp.json の seccomp プロファイル(Docker のデフォルトに名前空間の作成を追加したもの)を使用して、そのまま有効になっています。このファイルが存在するように、このリポジトリのチェックアウト先で Compose を実行してください。
Streamable HTTP を使って MCP クライアントを接続します:
{ "mcpServers": { "cuttingfloor": { "url": "http://127.0.0.1:8787/mcp" } } }
コマンドを起動するクライアント向けに、stdio でも接続できます。stdio プロセスは実行中のコンテナに転送するため、クライアントの終了後も時間のかかるエクスポートは続行されます:
{ "mcpServers": { "cuttingfloor": { "command": "docker", "args": ["exec", "-i", "cuttingfloor", "cuttingfloor", "mcp"] } } }
フォルダー(.env を compose.yaml と同じ場所に設定してください。.env.example を参照):
| お使いのマシン上 | コンテナ内 | 用途 |
|---|---|---|
$CUTTINGFLOOR_MEDIA(デフォルトは ~/Movies) | /media/videos(読み取り専用) | 素材です。{"path": "/media/videos/clip.mp4"} で読み込みます |
$CUTTINGFLOOR_EXPORTS(デフォルトは ~/cuttingfloor/exports) | /exports | 完成したエクスポート |
Docker ボリューム cuttingfloor-data | /data | タイムライン、プロキシ、ジョブ(有効期限付き) |
プロバイダーキーは各自で用意し、同じ .env に記述するか、Docker シークレット(/run/secrets/<name lower-cased>)に指定します。キーがツールを経由することはなく、video://server/health には各キーが設定されているかどうかだけが表示されます。create.lipsync には sync. labs の SYNC_API_KEY が必要です(Settings → API keys)。送信した秒数ごとにアカウントへ課金されます。キーを追加した後、docker compose up -d を実行してください。
イメージには /samples/sample.mp4(トーン付きの10秒テストパターン)と /samples/card.png が含まれているため、何もマウントせずに試せます。
Docker Desktop for Mac では、長時間の4Kタイムライン用にメモリ上限を引き上げてください。バインドマウントした素材の読み込みには VirtioFS が使われます。Linux では、初回起動前にエクスポートフォルダーを作成し、自分が所有するフォルダーにしてください。
エージェントでの使い方
- 各ファイルに対して
media.importを実行します。処理には時間がかかります。MCP Tasks に対応したクライアントではタスクが返され、そうでない場合はjob.getでポーリングするためのjob_idが返されます。ジョブの状態がprocessingになると、media_idを使用できます。 media.analyzeは、エージェントが編集に使えるデータにメディアを変換します。transcript(各単語とその時刻。CPU 上の whisper.cpp を使用し、モデルは一度だけダウンロードします)、beats(テンポ、ビート、ダウンビート)、faces(時間経過に伴う顔のボックス)、track(領域を追跡)です。次に、clip.add {source: {words: [i, j]}}で単語単位のカットを行い、caption.add {in_clip: {clip_id, segments}}でメディアの秒数を基準に字幕のタイミングを設定します。media.seekは平易な言葉で指定した条件から場面を見つけるため、エージェントが動画全体を見る必要はありません。{too_dark: "the faces are too dark to make out their eyes", demo: "the product dashboard fills the screen"}のような条件を渡すと、動画内、またはレンダリング中の編集内容のうち、それぞれの条件に当てはまる区間と、各区間の最適なフレームが返されます。品質の確認、何かが始まる位置の特定、ショットの選択、変化の検出、タイトル用の空きスペースの発見に使えます。フレームの判定には TypeSafe Jev を使用し、TYPESAFE_API_KEYが必要です。- シーケンス(
{width, height, fps: {num, den}})を指定してtimeline.createを実行します。 - 編集:
clip.add、clip.trim(J/L カットにはsideを指定)、clip.split、clip.move、clip.remove(rippleを指定)、clip.link、track.*、またはedit.batchを使って複数の編集を一度に適用します。バッチ内で先に作成した ID を参照するには、{"$ref": "ops[0].clip_id"}を使います。 - 時間:
clip.set_speed(一定の速度、速度ランプのcurve、reverse。ピッチは維持されます)、clip.freeze、clip.roll、clip.slip、clip.slide、clip.replace、およびrange.extract/range.liftを使うと、すべてのトラックから一度に範囲をカットできます。clip.add {nested_timeline_id}は、タイムライン全体を1つのクリップとしてネストします。 - トランジション:クリップの後のカット位置に
transition.addを追加します。ディゾルブ、黒または白へのディップ、ワイプ、スライド、プッシュ、ズーム、アイリス、スピンを使用できます。リンクされたオーディオには、同じカット位置でクロスフェードが適用されます。デフォルトではクリップが重なり、後続のクリップが前に移動します。mode: "handles"を使うと、カット位置を越えたソース部分を使い、位置は移動しません。 - テキスト:
title.addとcaption.add(単語のタイミングを含むセグメント、または SRT/VTT から)を使うと、動画トラックにテキストを配置できます。libass でレンダリングされ、フォント、サイズ、色、アウトライン、シャドウ、ボックス、カラオケ表示、単語のハイライト、タイプライター表示、単語ごとの表示に対応しています。text.setでは複数のテキストを一度に再スタイルできます。フォントはvideo://catalog/fontsに一覧表示されます。独自の.ttf/.otfをmedia.importでインポートし、font_media_idで使用できます。 - オーディオ:
audio.set_gain(dB。音量の調整にはキーフレームを使用)、audio.set_pan、audio.fade、audio.set_master(ミックス全体のゲインとリミッターの上限)を使います。オーディオ編集のプレビューには、測定されたラウドネスを示す波形画像が表示されます。 - エフェクト:クリップ、トラック上のすべてのクリップ、またはタイムライン全体に
filter.addを適用します。カラー(明るさ、コントラスト、彩度、露出、色温度、カーブ、.cubeとしてインポートした LUT)、ぼかし、シャープ化、ビネット、グレイン、グリッチ、ピクセル化、クロマキーに対応します。サウンドには EQ、コンプレッサー、ノイズ低減、ディエッサー、音声の強調、リバーブ、エコー、ピッチを使用できます。adjustment.addは、その再生中に下にあるすべての要素のエフェクトを変更するクリップを追加します。パラメーターを含む一覧はvideo://catalog/effectsにあります。 - コンポジット:クリップを上位の動画トラックに配置し、
clip.set_transform(位置、スケール、回転、不透明度、クロップ、反転、フィット。任意の数値にイージング付きキーフレームを設定できます)、clip.set_mask(長方形、楕円、線形、ミラー、ハート、星、ポリゴン)、clip.set_blend、clip.set_animation(開始、終了、ループのプリセット)を使います。使用可能な名前はvideo://catalog/{name}のリソースにあります。 - 作成:
create.motionは、アニメーション付き HTML をアルファ付きの動画にフレーム単位で正確にレンダリングします。CSS アニメーションとトランジション、Web Animations API、SVG、requestAnimationFrameで描画する canvas または WebGL、タイマー、ページで定義したwindow.__seek(seconds)は、すべてレンダラーが1フレームずつ進める仮想クロック上で実行されます。anime.js、three.js、Lottie、D3 はlib/から読み込みます(<script src="lib/anime.umd.min.js">)。create.stillは HTML ページを PNG にレンダリングし、create.matteは単色またはグラデーションの画像を作成します。どれもclip.addで使うmedia_idを返し、同じレシピからは同じメディアが返されます。ページからネットワークにはアクセスできないため、画像とフォントはassets(インポート済みメディア)として渡し、assets/<name>で参照します。create.voiceoverは、CPU 上で28種類の Kokoro 音声のいずれかを使って英語のテキストを読み上げ(約350 MB のモデルは一度だけダウンロードします)、すべての単語のタイミングを設定するため、caption.add {in_clip}で正確に字幕を付けられます。create.cutoutは被写体の背景を除去します。any(BiRefNet。製品、動物、物体、人に対応。画像でのデフォルト。Docker で約3 GB の空きメモリが必要)またはpeople(MODNet。動画に十分な速度で、動画でのデフォルト)を使用し、音声は維持されます。create.lipsyncは、カメラに映っている人物に新しい言葉を話させます。動画、新しい音声(再録音したセリフまたはボイスオーバー)、変更する動画の範囲を渡すと、sync. labs が独自のキーを使って口の動きを描き直し、音声に合わせます(ローカルではSYNC_API_KEY、ホスト環境ではX-Cuttingfloor-Key-Syncヘッダー)。送信されるのは指定した範囲だけで、結果もその範囲だけです。元の映像に重ねて配置してください。 - 確認:編集に
preview: "inline"を指定すると画像が返されます。render.framesは最大16フレームをコンタクトシートで、または最大4フレームをフルサイズ(size: "full")でサムネイルとして返します。 qa.checkはレンダリング結果を測定します。ギャップ、オフラインのメディア、フレーム数、ラウドネス、トゥルーピークに加え、指定した設定に基づいて黒い区間や無音区間を調べます。結果は事実の提示であり、評価は行いません。- プリセットを指定して
export.videoを実行します。利用できるプリセットはweb_1080p_h264、master_prores_422hq、social_9x16_h264、web_1080p_av1、gif、audio_wav_48k、audio_mp3です。overridesではサイズ、フレームレート、ビットレート、品質を指定できます(video://catalog/presets)。結果には署名付きダウンロード URL が含まれ、ローカルではエクスポートフォルダーにファイルが保存されます。 export.timelineを使うと、編集内容を FCPXML(Final Cut Pro、Resolve)、OTIO(Premiere、Resolve)、CMX 3600 EDL として別のエディターに渡せます。また、字幕を SRT または VTT として書き出せます。形式で保持できない内容はwarningsで通知されます。media: "collect"を指定すると、メディアを一緒に ZIP にまとめます。timeline.getはロスレスのコピーを保持します。 時刻はシーケンスのフレームレートに基づく整数フレームで、終了位置は含みません。timeline.getはタイムライン全体を JSON として返し、有効期限が切れた後はtimeline.loadで復元します。video://server/healthはエンジンのバージョンと制限を報告します。
ホステッドモード
同じイメージを CUTTINGFLOOR_MODE=hosted で実行すると、パスからのインポートはできず(URL のみ)、エクスポート用フォルダーもありません。また、すべてのリクエストで CUTTINGFLOOR_API_KEYS(owner:key,owner2:key2、または cuttingfloor_api_keys Docker シークレット)から取得した Authorization: Bearer <key> が必要です。各キーの所有者は、個別のタイムライン、メディア、ジョブを持ちます。CUTTINGFLOOR_PUBLIC_URL は必須です。ダウンロードリンクの生成に使用され、設定されていないとサーバーは起動しません。
ホステッド環境で使用するプロバイダーキーはクライアントから渡し、サーバーの環境変数からは取得しません。MCP クライアントはサーバー設定で各キーをヘッダーとして送信します。ヘッダー名は X-Cuttingfloor-Key-<Provider> です。たとえば create.lipsync では、X-Cuttingfloor-Key-Sync: <your sync. labs key> を送信します。キーはそのリクエストと、それによって開始されたジョブで使用された後、破棄されます。保存もログへの記録もされません。送信されていないキーを必要とするツールは、該当するヘッダー名を示して credential_required を返します。
{ "mcpServers": { "cuttingfloor": { "url": "https://api.cuttingfloor.ai/mcp", "headers": { "X-Cuttingfloor-Key-Sync": "<key>" } } } }
| 変数 | デフォルト | |
|---|---|---|
CUTTINGFLOOR_DATA | /data | データのルート |
CUTTINGFLOOR_MAX_JOBS | cores ÷ 4 | 同時に実行するインポート、エクスポート、QA 実行の数(サンドボックスジョブは代わりにサンドボックス内でキューに入ります) |
CUTTINGFLOOR_HEAVY_JOBS | 1 | create.cutout の同時実行数。上記のジョブとは別のスロットで実行します |
CUTTINGFLOOR_MAX_RENDERS | cores ÷ 2、最低 2 | 同時に実行するレンダリング(melt、エンコード、文字起こし)の数。ジョブとインラインプレビューを合わせた数で、残りは順番を待ちます |
CUTTINGFLOOR_OUTPUT_URL_TTL_HOURS | 24 | 署名付きダウンロードリンクの有効期間 |
CUTTINGFLOOR_MAX_DOWNLOAD_BYTES | 10 GiB | URL インポートとアップロードのサイズ上限 |
CUTTINGFLOOR_MOTION_URL | 未設定(compose で設定) | create.motion と create.still 用のサンドボックス。未設定の場合、これらのツールは起動方法を説明します |
CUTTINGFLOOR_MOTION_WORKERS | CPU 2 個につき 1 個、最大 4 個 | create.motion のレンダリングを共有するブラウザーの数。サンドボックス側で設定します |
開発
pnpm install && pnpm check # lint, typecheck, unit and protocol tests (Node 24+, pnpm 10)
docker build --target test . # everything, including engine and end-to-end tests
docker build -t cuttingfloor:dev . && node scripts/smoke-image.ts cuttingfloor:dev
node scripts/smoke-motion.ts cuttingfloor:dev # the sandbox in compose, attacked
構成
| パス | 内容 |
|---|---|
apps/cli | cuttingfloor serve(HTTP)、cuttingfloor mcp(stdio)、cuttingfloor motion-worker(サンドボックスの役割) |
apps/hosted | MCP エンドポイント、署名付きダウンロードとアップロード、API キー、スクリプトキーを提供する HTTP ノード |
packages/server | MCP ツール、リソース、Tasks アダプター |
packages/schema | すべてのツール、タイムラインドキュメント、エラー用の Zod スキーマ |
packages/core | タイムラインドキュメント、編集計算、コンテンツハッシュ、有効期限付きストレージ |
packages/engine | FFmpeg と MLT をサブプロセスとして実行:プローブ、コンフォーム、プロキシ、フレーム、エクスポート、QA |
packages/motion | サンドボックスワーカー:仮想クロック上でページをフレームごとに、1 つずつレンダリング |
tools/ | イメージに組み込まれたネイティブヘルパー(cf-vision、cf-segment)と、サンドボックス用の Chromium ラッパーおよび seccomp プロファイル |
packages/jobs | MCP Tasks と job.* を支える、ファイルベースのジョブストアとランナー |
packages/credentials | プロバイダーキーの持ち込み |
ライセンス
まだ選定されていません。ライセンスが追加されるまでは、すべての権利が留保されます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。