gflow-cli
Generate Veo videos and Nano Banana or Imagen images through your own Google Flow account
Drives Google Flow in a local Chrome window to make videos, images, narration and captions
By GTAI-1 (individual) TypeScript Local · stdio MediaAI and MLBrowser automation
33 popularity score ★ 534
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
git clone https://github.com/gtai-1/flow-mcp.git
cd flow-mcp
npm install
npm run build
npm run loginclaude mcp add flow -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'{
"mcpServers": {
"flow": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
]
}
}
}{
"mcpServers": {
"flow": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
]
}
}
}{
"servers": {
"flow": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
]
}
}
}[mcp_servers.flow]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"]gemini mcp add --scope user flow node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'GEMINI_API_KEY secret |
Optional: Google AI Studio key for Google narration voices. It can also be saved from the control panel. |
|---|---|
FLOW_MCP_OUTPUT |
Optional: Folder for downloaded and assembled media. |
FLOW_MCP_HOME |
Optional: Folder holding the Chrome profile, panel token and speech models. |
FLOW_MCP_PORT |
Optional: Port of the local control panel and API. |
FLOW_MCP_CDP_PORT |
Optional: Chrome DevTools Protocol port. |
FLOW_MCP_CHROME |
Optional: Path to the Chrome executable when it is not found by itself. |
FLOW_MCP_PATIENCE_MS |
Optional: How long a call waits before handing back a task id for flow_wait. |
FLOW_MCP_FFMPEG |
Optional: Path to ffmpeg. |
FLOW_MCP_WHISPER |
Optional: Path to whisper.cpp's whisper-cli. |
FLOW_MCP_WHISPER_MODEL |
Optional: Path to a whisper model file to use instead of the downloaded ones. |
| Set together: pacing | |
FLOW_MCP_PAUSE_MIN_S |
Optional: Shortest pause between generations, in seconds. |
FLOW_MCP_PAUSE_MAX_S |
Optional: Longest pause between generations, in seconds. |
This is a local stdio MCP server for Google Flow (flow.google.com). Claude, Codex or another MCP client can use it to make videos and images on Flow's own daily credits instead of the paid video API. It starts a Chrome window with its own profile and presses Flow's real buttons through the Chrome DevTools Protocol. Nothing is hosted and there is no browser extension.
The 20 tools in src/index.ts cover queuing image and video scenes (with first and last frames, reference images and a credit cap per scene), building reusable characters, and pulling down or trashing media that is already in a project. You can also run video-to-video edits and record narration. With FFmpeg installed it joins clips into one MP4 with music. Newer tools add captions burned into a video and word-timed transcripts. Both run whisper.cpp on your own machine and spend no Flow credits. Files are saved under ~/flow-mcp-out/<project>/ by default. A control panel at http://127.0.0.1:8787 (npm run studio) does the same jobs without an assistant.
A few things the README skips can be read in the source. A call that runs past 45 seconds returns a task id and keeps working in the background, and flow_wait picks up the result later. FLOW_MCP_PATIENCE_MS changes that limit. flow_edit and flow_continue refuse to run unless acknowledge_cost is true, because Flow shows no price before them. The first time you caption with the language left on auto, a 60 MB model is fetched to detect the spoken language.
| Runtime | Node.js 22+ |
|---|---|
| Runs on | macOS, Windows |
| Google Flow | Free tierAny Google account gets 50 credits a day. A paid Google AI plan adds credits and 1080p downloads |
| Google AI Studio | Free tierOptional key, used only for Google narration voices |
| Also |
|
Clone the repository, then run npm install and npm run build. Run npm run login once and sign in to Google by hand in the Chrome window it opens, then open a Flow project and leave that window open. On a Mac, keep the folder out of ~/Desktop, ~/Documents and ~/Downloads, or the server fails with EPERM. For captions, install whisper.cpp (brew install whisper-cpp on a Mac, whisper-cli.exe from the whisper.cpp releases on Windows). Its speech model downloads from Hugging Face on first use: 148 MB for English, 574 MB for other languages.
Good for someone who already has a Google account and wants an assistant to storyboard and render short films or image sets on Flow's free daily credits, then cut, narrate and caption them on their own computer. It has to drive a visible Chrome window on a Mac or Windows PC, so it will not work on a headless server or Linux, or in CI. It also depends on Flow's interface staying the same. Anyone who needs a supported, terms-safe pipeline should look at Google's paid video API, which this project names as the thing it avoids, rather than browser automation.
7 only read, 13 change things. A ? marks an optional parameter.
flow_statusdetailed?: booleanflow_generate changesproject: stringscenes: arrayflow_waitjob_ids?: arraytimeout_seconds?: integerflow_cancel changesjob_id: stringflow_retry changesjob_ids?: arrayflow_assetskind?: enumflow_download changesproject: stringassets: arrayquality?: enumflow_trash changesname: stringflow_agent_images changesproject: stringscenes: arrayaspect_ratio?: enumdownload_quality?: enumreferences?: arrayscene_references?: objectflow_edit changesproject: stringasset: stringprompt: stringacknowledge_cost: booleandownload_quality?: enumflow_continue changesproject: stringfrom_asset: stringprompt: stringattach?: arrayaspect_ratio?: enummode?: enumacknowledge_cost: booleandownload_quality?: enumforce?: booleanflow_character changesname: stringdescribe?: stringimage?: stringaspect_ratio?: enumpersonality?: stringvoice?: stringflow_character_edit changesname: stringchange?: stringlook?: stringflow_charactersflow_techniquescategory?: enumflow_narrate changesproject: stringengine?: enumtext: stringvoice?: stringstyle?: stringflow_voicesflow_assemble changesproject: stringclips?: arraymusic?: stringmusic_volume?: numberclip_volume?: numbervoiceover?: stringvoice_lines?: arrayoutput_name?: stringhold_last_frame?: booleanflow_transcribevideo: stringlanguage?: stringwords?: booleanflow_captions changesvideo: stringstyle?: enumposition?: anysize?: anycolor?: stringtext?: stringlanguage?: stringproject?: string