MCP-native · 21 tools

How AI agents ship video
with Lumiqa.

Your agent generates a clip with Veo, Runway or Sora. It uploads to Lumiqa, requests a review, waits for approval, then delivers — all through native MCP tools your agent calls by name. This is the six-step pipeline, with the exact calls your agent will make.

The pipeline at a glance

1 GenerateAgent + Veo / Runway / Sora
2 Uploadupload_video
3 Reviewrequest_review
4 Feedbackget_content / list_content
5 Approveapprove_content
6 Deliverdeliver_asset
01

Step 1: Connect your agent in 10 seconds

Every Lumiqa workspace exposes a native MCP server at https://lumiqa.io/mcp/<slug>. It speaks JSON-RPC 2.0 — initialize, tools/list, tools/call — and authenticates with a workspace key shaped lk_live_… sent as a Bearer header. Any MCP-capable agent stack can speak it.

If you live in Claude Desktop or Claude Code, the MCP path is one command. Lumiqa shows up as a first-class tool group inside the agent — the LLM can call upload_video, request_review, list_content, approve_content and deliver_asset by name, no glue code required.

Claude MCP
# Pair Lumiqa with Claude Code or Claude Desktop
claude mcp add lumiqa https://lumiqa.io/mcp/<slug> \
  --header "Authorization: Bearer lk_live_…"

# Verify the tools registered
claude mcp tools lumiqa
# → list_content, get_content, upload_video, request_review,
#   approve_content, request_changes, deliver_asset, … (21 in total)
  • 21 MCP tools cover the entire upload → review → approve → deliver loop
  • From core actions (upload, review, approve, deliver) to vision AI, generation, distribution and workspace memory
  • Workspace keys are scoped: a single lk_live_ sees only its own workspace
  • Free Developer tier ships with the full tool set unlocked from day one
Pro tip: Add Lumiqa to your .mcp.json in the repo, not the global Claude config. The agent gets the tool only when it's working in that project — fewer surprises.
02

Step 2: Upload a generated video

The first thing your agent does after a Veo, Runway or Sora call returns is push the output into Lumiqa. From the LLM's perspective it's one tool call: upload_video with the generation URL. Lumiqa fetches the file server-side, stores it in the review area, and links it to a content item.

If you don't pass a content_id, Lumiqa creates a new content item from the title you give it. Either way the call returns an upload_id and a content_id your agent plugs into the next step.

MCP · JSON-RPC tools/call
curl -X POST https://lumiqa.io/mcp/<slug> \
  -H "Authorization: Bearer lk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0", "id": 1, "method": "tools/call",
    "params": {
      "name": "upload_video",
      "arguments": {
        "url": "https://veo.googleapis.com/…/render.mp4",
        "title": "Veo render — campaign hero",
        "brand": "Acme"
      }
    }
  }'

# → { "ok": true, "upload_id": "u_8f3a…",
#     "content_id": "c_71c2…", "r2_key": "…" }
MCP · upload (Claude)
Tool call: upload_video
arguments:
  url: "https://veo.googleapis.com/…/render.mp4"
  title: "Veo render — campaign hero"
  brand: "Acme"
Pro tip: Re-uploading against the same content_id keeps every cut on one content thread. Your agent reads the thread back with get_content — useful when you regenerate and compare.
03

Step 3: Request a review

An uploaded cut is dormant until someone needs to look at it. Your agent opens a review by calling request_review with the content id and an optional note for the reviewers. That moves the content into the Attesa Approvazione state, and the latest upload becomes the cut under review.

Reviewers see it on the workspace board and in the web player — no account needed for invited teammates. Your agent can keep working while a human looks: it polls list_content filtered by status to know when the cut clears, so it never blocks on a human who didn't show up.

MCP · request_review
curl -X POST https://lumiqa.io/mcp/<slug> \
  -H "Authorization: Bearer lk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0", "id": 2, "method": "tools/call",
    "params": {
      "name": "request_review",
      "arguments": {
        "id": "c_71c2",
        "note": "Hero cut for the Acme campaign — quick look?"
      }
    }
  }'

# → { "ok": true, "id": "c_71c2",
#     "new_stato": "Attesa Approvazione" }
  • One call moves a cut into review and notifies the workspace
  • Invited teammates review in the web player — no friction
  • Agents poll list_content by status to drain the queue
  • Every content item has a stable id your agent can store
04

Step 4: Collect timecoded feedback

Humans review in the same web player every Lumiqa user knows — pause, type, pin the comment to the exact frame, draw on the canvas if pointing matters more than wording. Their feedback is structured: every note has a timecode in milliseconds, an author, optional drawing data, and a thread of replies. Nothing free-text-only, nothing buried in email.

Your agent reads the same content thread through get_content (one item) or list_content (the whole board, filtered by status). The response carries the current state, brand, editor and dates, so an LLM can summarise the notes, decide whether the cut needs a regenerate, and act — without a single GUI screenshot. This is the loop that closes the agentic pipeline.

MCP · get_content
curl -X POST https://lumiqa.io/mcp/<slug> \
  -H "Authorization: Bearer lk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0", "id": 3, "method": "tools/call",
    "params": { "name": "get_content",
                "arguments": { "id": "c_71c2" } }
  }'

# → {
#   "id": "c_71c2",
#   "stato": "Da modificare",
#   "title": "Veo render — campaign hero",
#   "brand": "Acme", "editor_assigned": "anna@acme",
#   "posting_date": "2026-05-22"
# }
Pro tip: When the state comes back as Da modificare, feed the human notes straight into the LLM's next prompt. The agent re-generates v2, re-uploads to the same content_id, and calls request_review again — a tight regenerate loop with zero copy-paste.
05

Step 5: Approve or request changes

Once the notes are in, the verdict is one of two calls. approve_content promotes the latest review cut to the Deliverables area and flips the content to Approvato — the green light for delivery. request_changes sends it back with a comment, flipping the content to Da modificare so the agent knows to regenerate.

An agent can drive both ends: a human approves in the UI, or — when you trust the cut — the agent calls approve_content itself after its own compliance_scan or analyze_video pass clears. Either way, the state machine is the single source of truth your agent polls with list_content.

MCP · approve_content
curl -X POST https://lumiqa.io/mcp/<slug> \
  -H "Authorization: Bearer lk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0", "id": 4, "method": "tools/call",
    "params": { "name": "approve_content",
                "arguments": { "id": "c_71c2" } }
  }'

# → { "ok": true, "id": "c_71c2",
#     "previous_stato": "Attesa Approvazione",
#     "new_stato": "Approvato", "promotion": { … } }
  • approve_content promotes the cut to Deliverables in one call
  • request_changes sends a note back and flips to Da modificare
  • Agents can self-approve after a compliance_scan guard passes
  • State is the source of truth — poll it with list_content
06

Step 6: Deliver to the next pipeline step

Approval is the green light, not the finish line. Most agents now need to hand the file off — to a client, a downstream worker, or a social-media scheduler. deliver_asset wraps that handoff into one call: it mints a signed delivery URL for the approved final cut, valid 24h by default (up to 7 days).

Pass mark_posted: true to also flip the content to Postato in the same call — handy when delivery is the publish step. The content must be in Approvato first, so run approve_content before this. For multi-channel publishing, hand the URL to cross_post or schedule_post.

MCP · deliver_asset
curl -X POST https://lumiqa.io/mcp/<slug> \
  -H "Authorization: Bearer lk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0", "id": 5, "method": "tools/call",
    "params": {
      "name": "deliver_asset",
      "arguments": {
        "id": "c_71c2",
        "mark_posted": true,
        "expires_in_hours": 48
      }
    }
  }'

# → { "ok": true, "id": "c_71c2",
#     "delivery_url": "https://lumiqa.io/api/deliver/…",
#     "expires_in_hours": 48, "marked_posted": true }
Pro tip: Chain it. upload_videorequest_reviewapprove_contentdeliver_asset is the whole loop, and run_workflow can orchestrate it end-to-end so your agent fires one tool instead of five.

Let your agent ship video
while you sleep.

Free Developer tier · MCP-native · 100 uploads / month · no credit card.

Create your workspace → Integration examples open-source on GitHub · questions? [email protected]

MCP (Model Context Protocol) is an open standard from Anthropic. Veo, Runway and Sora are trademarks of their respective owners; Lumiqa is not affiliated with them. The tool calls documented above describe the production MCP surface (JSON-RPC over /mcp/<slug>, 21 tools); full reference at lumiqa.io/docs.