upload_video
What it does
Fetches a video from a public URL server-side and writes it into the workspace's review area in R2. If no content_id is supplied, a new content row is created with the given title.
The whole flow is one round-trip from the agent's point of view: the byte stream never touches Claude. Built for plugging in Veo / Runway / Sora outputs without forcing the agent to bridge them.
Input schema
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| url | string | required | — |
Public URL of the video to fetch. |
| content_id | string | optional | — |
Existing content to attach to. If omitted, a new content is created. |
| title | string | optional | — |
Title for the new content. Required when content_id is omitted. |
| brand | string | optional | — |
Brand label for the new content. |
| filename | string | optional | — |
Override the stored filename. Defaults to the last URL segment. |
Example call
json{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "upload_video", "arguments": { "url": "https://veo.example.com/cdn/video.mp4", "title": "Veo concept — coffee morning", "brand": "CorpoSostenibile" } } }
Response shape
json{ "ok": true, "upload_id": "u_abc123def456", "content_id": "c_xyz789abcdef", "r2_key": "your-slug/review/CorpoSostenibile/Veo concept — coffee morning/1716301234567-video.mp4", "size_bytes": 12345678, "content_type": "video/mp4" }
Usage from Claude Desktop
prompt"Take the Veo output at https://veo.example.com/cdn/video.mp4, upload it as a new content called 'Veo concept — coffee morning', and put it under brand CorpoSostenibile."
Usage from Python
pythonimport requests LUMIQA = "https://lumiqa.io/mcp/your-slug" HEADERS = {"Authorization": "Bearer lk_live_xxxxxxxxxxxx"} r = requests.post(LUMIQA, headers=HEADERS, json={ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "upload_video", "arguments": {"url": "https://veo.example.com/cdn/video.mp4", "title": "Veo concept"} }, }) print(r.json())
Usage from Node
javascriptconst r = await fetch("https://lumiqa.io/mcp/your-slug", { method: "POST", headers: { "Authorization": "Bearer lk_live_xxxxxxxxxxxx", "Content-Type": "application/json", }, body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: "upload_video", arguments: { url: "https://veo.example.com/cdn/video.mp4", title: "Veo concept" }, }, }), }); const data = await r.json(); console.log(data);
Required env vars / integrations
- R2 binding
UPLOADS— configured per-workspace at deploy time. - No external API keys.
Known limitations
- Max file size: 500 MB. Bigger files return
File too large (max 500MB via MCP upload). - The source URL must be publicly reachable from Cloudflare's edge — auth'd / time-limited URLs work as long as Workers can fetch them once.
- The new content is created with status
In Editing; the upload itself is filed in thereviewarea. - Filenames are clipped to 200 chars; path separators are sanitized.