analyze_video
What it does
Sends the latest review video for a content item (or a specific upload_id) to Claude vision and returns a strict-JSON analysis: hook score, retention prediction, detected objects/brands, transcript excerpt, sentiment, suggested cuts, and a two-sentence summary.
Use focus to narrow scope — e.g. focus: "hook" for a fast first-3-seconds-only pass, or focus: "brands" when you only care about IP risk.
Input schema
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| content_id | string | optional | — |
Uses the latest review upload. Pass this or upload_id. |
| upload_id | string | optional | — |
Specific upload to analyze. Overrides content_id. |
| focus | string | optional | "full" |
hook · brands · pacing · full. |
Example call
json{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "analyze_video", "arguments": { "content_id": "c_abc123", "focus": "full" } } }
Response shape
json{ "ok": true, "content_id": "c_abc123", "upload_id": "u_xyz789", "filename": "veo_cut_v3.mp4", "model_used": "claude-sonnet-4-6", "focus": "full", "analysis": { "hook_score": 7, "retention_prediction": "high", "detected_objects": ["espresso machine", "barista hands"], "detected_brands": ["La Marzocco"], "transcript_excerpt": "Today we're pulling the perfect shot...", "sentiment": "positive", "suggested_cuts": [ { "start": 4.2, "end": 5.8, "reason": "dead air between steps" } ], "summary": "Tight espresso tutorial with strong opening shot. La Marzocco logo is prominently visible — flag for sponsorship disclosure." }, "notes": [ "Video URL passed directly to Claude API..." ] }
Usage from Claude Desktop
prompt"Analyze the latest review cut on c_abc123 and tell me if the hook is strong enough for Reels."
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": "analyze_video", "arguments": {"content_id": "c_abc123", "focus": "hook"} }, }) 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: "analyze_video", arguments: { content_id: "c_abc123", focus: "hook" }, }, }), }); const data = await r.json(); console.log(data);
Required env vars / integrations
- Pages secret
ANTHROPIC_API_KEY—wrangler pages secret put ANTHROPIC_API_KEY --project-name=lumiqa-saas. - Optional
USE_PREMIUM_VISION=trueto switch from Sonnet to Opus. - R2 binding
UPLOADS. - Secret
MCP_DELIVERY_SECRETfor signing the URL Claude fetches.
Known limitations
- 200 MB hard cap per video. Bigger files error out — future iteration: external frame-extraction worker.
- No real frame sampling yet — the model sees the whole asset via signed URL.
- If audio is missing the model returns
transcript_excerpt: ""rather than hallucinating. - Brand detection is intentionally conservative — only visible logos / packaging are listed.