Video feedback MCP

Your agent can edit video.
Chat is a terrible place to review it.

Flask is a video feedback MCP server for reviewing AI-edited video. Your coding agent uploads the render, you watch it and just talk. Flask turns what you say into timestamped, transcribed comments the agent reads over MCP. Then it fixes the cut and pushes v2 to the same link.

By Enrico Tartarotti, founder of Flask · Updated

The typed-paragraph problem

Remotion, HyperFrames, and ffmpeg gave coding agents the ability to produce real video. The render is the easy half. Then you watch the output and try to type something like: "around the seven second mark, the title eases in too slowly, and the third emoji in the bottom row overlaps the second one when they bounce." Three sentences, two ambiguities, and the agent still guesses.

Pointing at a frame and saying "this one, make it a crocodile" takes two seconds. That gap is why agentic video editing stalls at the feedback step, not the rendering step.

How the loop works

  1. The agent uploads its render to Flask. You get the flask.do link the moment the upload starts, not when processing ends. Open it and watch the video arrive.
  2. You review by talking. Hit record, speak, draw on the frame, scrub the timeline. Each recording becomes one comment, pinned to the moment you started it, with the verbatim transcript and an AI-organized version of what you said.
  3. The agent reads your feedback as data. Verbatim transcripts, timestamps in seconds, tags, reply threads. When you say “this”, it can fetch the exact frame you meant, with your drawing rendered in, and see what you saw.
  4. It fixes the cut and uploads a new version. Same asset, same link, v2 on top. You leave another round of feedback or call it done.

While you review, the agent sits on wait_for_feedback, a long-poll that hands it your comments seconds after you leave them. You never paste feedback into a chat window.

What the agent actually receives

Every piece of feedback arrives machine-readable. A voice comment at 0:07 looks like this to the agent:

{
  "type": "recording",
  "timestamp": 7.2,
  "content": "- Make [this big emoji](#rt=1.4) a crocodile\n- The bottom row needs seven emojis, not five",
  "recording": {
    "recording_type": "voice",
    "transcript": "this big emoji here - make it a crocodile,
                   and the bottom row needs seven, not five",
    "pipeline_status": "complete",
    "visual_references": [
      { "phrase": "this big emoji", "recording_time": 1.4 }
    ]
  },
  "tags": [{ "name": "Animation" }],
  "reply_to": null,
  "url": "https://flask.do/a/vDbh2?element=..."
}

One recording is one comment. content is the AI-organized version, your ramble tidied into points, with each “this” marked by the second of the recording it was spoken at, which the agent turns into the exact frame you meant. recording.transcript keeps every word verbatim.

How to review Claude Code renders by voice

One round, start to finish. Claude Code is the example; Cursor and Codex connect with the same command and work the same way.

  1. Connect Flask. Run npx flask-feedback in your terminal, or paste it to Claude Code and it runs it. Sign in to Flask in the browser window it opens, then restart the session. Using a Claude app or another agent? See Connect your agent below.
  2. Have the agent upload its render. Ask in your own words, for example “upload the intro render to Flask, wait for my feedback, and upload the fix as v2”. Claude Code uploads the local file and hands you the flask.do link as soon as the upload starts. If the render was made with code, the version also carries its source files and notes, so the next agent can pick up the work.
  3. Record your feedback by talking and drawing. Open the link, hit record and review the way you would with an editor next to you: speak, scrub, pause, draw on the frame. Each recording becomes one comment, pinned to the moment you started it, with the verbatim transcript and an AI-organized version of what you said. Typed comments work too.
  4. The agent reads your timestamped comments over MCP. It waits on wait_for_feedback, which hands it each comment seconds after you leave it (a recording once its transcript is done). For every “this” you said, it can fetch the frame you meant with your drawing rendered in.
  5. It uploads the next version. The agent makes the changes and uploads the fix as a new version of the same asset: same link, v2 on top, earlier versions behind it. It marks the feedback it implemented Done and replies only where you asked it a question. Review v2 the same way, or call it done.

Connect your agent

Claude Code, Cursor or Codex: run one command, or paste it to your agent and it runs it. It connects Flask to each of them you have and opens the browser once to sign in; then restart the agent session.

npx flask-feedback

Claude apps (claude.ai, Claude Desktop, mobile, Cowork): Open Customize > Connectors (claude.ai/customize/connectors), choose Add custom connector, paste https://api.flask.do/api/mcp/mcp, then sign in to Flask. Connected once, Flask works in every Claude app, and in Claude Code when you sign in to it with your Claude account.

By hand: Claude Code claude mcp add --scope user --transport http flask https://api.flask.do/api/mcp/mcp (then /mcp to sign in), or one click in Cursor. Nothing else to install: the server teaches the agent the review loop.

Or paste this into any agent: it connects Flask (the command above, or the connector in a chat app), then uploads what you're working on, or offers to make a short test animation.

Connect Flask (flask.do) and upload what we're working on to it, or offer to make a short test animation if there's nothing.
Follow https://flask.do/start.md (read the whole page as written, not a summary; in a terminal, e.g. curl -fsSL https://flask.do/start.md).

Questions

Which agents work with Flask?

Anything that speaks MCP: Claude Code, claude.ai, Cursor, and other MCP clients. The agent connects to https://api.flask.do/api/mcp/mcp, you authorize once in the browser, and from then on it can upload videos, read feedback and reply to it.

Does the agent get full access to my account?

No. The agent acts as you, under the same permissions as the app, and its token only works for the routes the MCP tools use. It can browse folders and assets, read feedback, upload videos and images (to folders you can edit, or your team's top level), post comments and replies, edit the text of your own comments, create and apply your team's tags, create folders, rename, move and share folders and assets (link and team access, as the Share tab does), and regroup an asset's versions. It cannot delete anything or touch billing or your account settings, and it never sees email addresses.

How does the agent know when I've left feedback?

It calls wait_for_feedback, which holds the connection open for up to 45 seconds and returns new feedback within seconds of it arriving. A voice, camera or screen recording arrives once its transcript is done, and the agent's own comments are never handed back to it as feedback. No inbox, no webhooks to configure, no manual copy-paste back into the chat.

What happens when I ask for changes?

The agent uploads the revision as a new version of the same asset. You keep one link that opens the current cut (the newest upload, unless you reorder the versions), with every earlier version in the stack behind it.

What does it cost?

Reviewers are free, always: a one-click sign-in to comment, never a paid seat. Flask has a free plan with every feature and no card: 5 assets, each with unlimited versions, for you and your agents alike. Pro is $15 per user per month, billed yearly, for unlimited assets.

What Flask doesn't do

Flask reviews video and images. There is no document proofing and no asset management. The agent's OAuth sign-in needs a browser once, so fully headless CI runs aren't supported yet. If you need those things, Flask is the wrong tool and we'd rather you find that out here.

Give your agent somewhere to ship its cuts

Free plan, no card. Reviewers never pay for a seat.