Skip to main content
Glama

google-flow-mcp

MCP server that generates images and video on Google Flow through browser automation, so you can use your own Google AI Pro subscription instead of paying per-credit services. Ships with a Claude Code skill.

Validated end-to-end: images (Nano Banana / Imagen) and video (Veo 3.1 / Omni Flash) are generated in a real Flow project and downloaded to disk.

Adapted and hardened for the current agent-first Flow UI (and Windows) from TMSSS05/google-flow-browser-mcp.

What it does

Playwright connects over the Chrome DevTools Protocol to a dedicated Chrome that is logged into your Google account. It drives Flow's agent to generate media and downloads the result through the authenticated session. No API keys, no password handling — it uses your existing browser session.

Tools (17): flow_connect, flow_status, flow_account_check, flow_discover_ui, flow_generate_image, flow_generate_video, flow_download_latest, character/scene tools, flow_use_grid_architect, flow_screenshot, flow_queue_status, …

Related MCP server: google-flow-mcp

⚠️ Terms of Service

This is unofficial browser automation. There is no official Google API for Flow. The launcher starts Chrome directly so navigator.webdriver is false, which is an explicit anti-bot measure. Automating Google properties can violate Google's Terms of Service and may put your account at risk. Use at your own risk, on your own account.

Requirements

  • Node.js ≥ 22 (with npm)

  • Google Chrome or Microsoft Edge (Chrome 149+ needs Playwright ≥ 1.61.1, already pinned)

  • A Google account with access to Flow (Google AI Pro recommended)

Install as a Claude Code plugin

This repository is both a Claude Code plugin and a plugin marketplace. The plugin bundles the MCP server and the google-flow-generate skill.

claude plugin marketplace add minhezluv/Google-flow-mcp-generate
claude plugin install google-flow@google-flow-mcp

Or inside a session: /plugin marketplace add minhezluv/Google-flow-mcp-generate, then /plugin install google-flow@google-flow-mcp.

When the plugin is enabled, Claude Code asks for two optional settings:

Setting

Default

Purpose

Google account

empty

Gmail address that must be signed in to Flow; empty skips the check

Browser debugging port

9222

CDP port of the dedicated browser

On the first tool call the server copies itself to the plugin data directory (~/.claude/plugins/data/<plugin-id>/), runs npm ci there (about a minute) and creates home/config/flow.config.json, where the remaining settings live. Outputs, logs and the job store are kept under that home/ directory, so they survive plugin updates.

Then ask Claude for an image or a video. The skill starts the dedicated browser with scripts/ensure-flow-chrome.mjs (Windows, macOS, Linux). On first use, sign in to Google in that window and click "Sign in to Flow"; the profile in ~/.google-flow-mcp/browser-profile keeps the session.

To try a local checkout without the marketplace: claude --plugin-dir .

Use with any MCP client (npm)

The server is published on npm as @minhezluv/google-flow-mcp and listed in the MCP Registry as io.github.minhezluv/google-flow. Add it to your client's MCP configuration (Claude Desktop, Cursor, VS Code, …):

{
  "mcpServers": {
    "google-flow": {
      "command": "npx",
      "args": ["-y", "@minhezluv/google-flow-mcp"],
      "env": { "FLOW_EXPECTED_ACCOUNT": "you@gmail.com" }
    }
  }
}

Variable

Default

Purpose

FLOW_EXPECTED_ACCOUNT

unset

Gmail address that must be signed in to Flow

FLOW_CDP_PORT

9222

CDP port of the dedicated browser

FLOW_MCP_HOME

~/.google-flow-mcp/home

Config, outputs, logs and job store

Before generating, start the dedicated browser and sign in to Google and Flow in it once:

npx -y -p @minhezluv/google-flow-mcp google-flow-chrome

Manual setup (from a checkout)

npm install
cp config/flow.config.example.json config/flow.config.json
# edit config/flow.config.json → set expectedAccount and chromeUserDataDir

Start the dedicated Chrome (idempotent — launches only if needed):

node scripts/ensure-flow-chrome.mjs        # any OS; --port, --profile, --browser optional
powershell -File scripts/ensure-flow-chrome.ps1   # Windows-only original

First run: in that Chrome window, sign in to your Google account and click "Sign in to Flow" on labs.google (Flow uses a separate sign-in). The session is saved in the dedicated profile and reused.

Register the server with your MCP client (Claude Code, etc.):

{
  "mcpServers": {
    "google-flow": { "type": "stdio", "command": "node", "args": ["<path>/src/index.js"] }
  }
}

Restart the client afterwards (the server loads into memory at startup).

Daemon

Only one process may drive the Flow Chrome. src/daemon/main.js owns it, keeps a serial job queue in data/jobs.json and listens on 127.0.0.1:47821 (daemonPort). The MCP server starts the daemon on first use and forwards every tool call to it; other programs (for example the Hypit provider) submit generation jobs over HTTP.

npm run daemon
curl http://127.0.0.1:47821/health

Requests other than /health need authorization: Bearer <config/daemon-token>; the token is created on first start.

Route

Purpose

GET /health

Chrome, sign-in and queue state

GET /credits

Current credit balance; authenticated and serialized under the browser lock

POST /uploads

Reference image bytes (PNG/JPEG/WebP) → { id }

POST /jobs

{ kind, model, prompt, aspectRatio, duration?, references?, firstFrame?, lastFrame?, ingredients?, project?, confirmCredits, idempotencyKey }

GET /jobs/:id

queued · running · succeeded · failed · interrupted, with phase and outputs

GET /jobs/:id/outputs/:n

Generated file

POST /tools/:name

Run one MCP tool under the browser lock

Every generation job needs confirmCredits: true. A repeated idempotencyKey returns the existing queued, running or succeeded job instead of spending credits again.

Models: nano-banana-2, nano-banana-pro, nano-banana-2-lite, veo-3.1-lite, veo-3.1-fast, veo-3.1-quality, omni-flash (Omni 1.1 Flash). Images accept ratios 16:9, 4:3, 1:1, 3:4, 9:16; videos 16:9 and 9:16. Reference images (image jobs), first/last frames and ingredients (video jobs) are uploaded through Flow's ingredient picker.

The driver targets https://flow.google.com/, finds controls by their Material icon names, sets model/ratio/count in Flow's settings panel before each job and switches Flow's "confirm before generating" option to "never" — the daemon's confirmCredits flag is the spending gate. It refuses to run when the signed-in account differs from expectedAccount. Flow adds a visible AI watermark in some regions.

The prompt names the exact model and forbids substitution. After rendering, the driver reloads the finished project's persisted history and checks its model_display_name against the media id before downloading. It reads the UI's observed GN0Bre batchexecute response; unknown or ambiguous metadata fails with UI_CHANGED, and a substituted model fails with UNSUPPORTED_INPUT. Neither failure submits another generation. Verified signed media URLs stay in a bounded in-memory cache so download retries do not rely on opaque thumbnails after reload.

The check runs after Flow has already charged for the render. If Flow changes that undocumented response and every job starts failing with UI_CHANGED, set "verifyModel": false in config/flow.config.json and restart the daemon: results are then downloaded without the model check, so a silent model substitution would go unnoticed until the check is repaired.

Live measurements on 2026-10-01: Nano Banana 2/Pro/2 Lite images cost 0; Veo Lite/Fast/Quality 8-second text videos cost 10/20/100; Omni Flash text at 6 seconds costs 10, and its 8-second first+last-frame or single-ingredient modes cost 12. Flow silently changed requested Lite frame-pair/ingredient jobs to Omni in earlier tests; request Omni explicitly for these modes. See capabilities for the measured scope.

After updating, restart your MCP client so it loads the proxy version of the server.

Notes that matter

  • Images are effectively free against the monthly Flow credit pool; video consumes credits (Veo 3.1 Lite ~10, Fast ~20, Quality ~100; Omni Flash 10 for 6s text / 12 for 8s references, out of ~1000/month). Video shows a credit-confirmation dialog which the server approves.

  • Model/duration must be a valid combo or Flow's agent asks for clarification and nothing generates (e.g. Veo 3.1 Lite is 8s-only on the Pro plan; measured Omni modes are 6s text and 8s references).

  • Flow is agent-first: prompts are wrapped imperatively so the agent generates directly instead of asking questions.

  • The UI language follows your Google account; navigation selectors cover IT/FR/EN.

Claude Code skill

The plugin installs the skill automatically. Without the plugin, copy skills/google-flow-generate/ to ~/.claude/skills/ and replace ${CLAUDE_PLUGIN_ROOT} and ${user_config.cdp_port} in its SKILL.md with your checkout path and port.

Releasing

Keep these versions equal: package.json, server.json (version and packages[0].version) and .claude-plugin/plugin.json. Then:

npm test
claude plugin validate --strict .
npm publish --access public          # npm package used by npx and the MCP Registry
mcp-publisher login github           # once; the account must be minhezluv
mcp-publisher publish                # reads server.json
git push                             # plugin marketplace users get the update

License

MIT — see LICENSE.

videoCooldownMs (default 30000) spaces video jobs: each video waits that long after the previous one finished. Three Veo jobs submitted back to back were each rejected within ~27 s with Flow's generic "something went wrong" tile, and the failures still consumed credits. Images do not wait.

Available Tools

17 tools
flow_account_checkA

Verify the logged-in Google account matches the configured expected email (Profile 3).

Inputs: no named parameters.

flow_connectA

Launch Chrome with the configured Google profile, connect CDP, navigate to Google Flow, and verify account.

Inputs: headless, open_flow.

flow_create_characterC

Create a new character in Google Flow Characters with name and description.

Inputs: name (required), description (required), campaign, project_name, +1 more.

flow_create_sceneB

Create a new scene in Google Flow Scenes with characters and prompt.

Inputs: prompt (required), campaign, characters, project_name.

flow_disconnectA

Close the browser and clean up the MCP connection to Google Flow.

Inputs: no named parameters.

flow_discover_uiA

Navigate to a Google Flow page and discover all interactive elements (buttons, inputs, links, headings). Updates the internal selectors map for robust automation.

Inputs: page (required).

flow_download_latestB

Download the most recently generated file from Google Flow.

Inputs: no named parameters.

flow_generate_imageA

⚠️ CES IMAGES CONSOMMENT DES CRÉDITS. Par défaut (auto_confirm=false): remplit le prompt, sélectionne le modèle/ratio, prend un screenshot et retourne "ready_for_confirmation". NE clique PAS sur Generate. Quand auto_confirm=true: vérifie d'abord que l'interface est bien en mode IMAGE (pas Vidéo), que le modèle est un modèle image, prend un screenshot de vérification, PUIS clique Generate, attend les images et les télécharge. NAN/BANANA modèles image seulement.

Inputs: prompt (required), brand, model, ratio, +4 more.

flow_generate_videoA

⚠️ CONSUMA CREDITI FLOW (Veo/Omni). Con auto_confirm=false (default): prepara il prompt video e si ferma senza generare (nessun credito). Con auto_confirm=true: invia, attende il render (minuti) e scarica l'mp4. Modello economico per test: "lite" (Veo 3.1 Lite).

Inputs: prompt (required), model, ratio, campaign, +4 more.

flow_import_characterB

Import a character from a saved JSON file into Google Flow.

Inputs: file_path (required).

flow_open_charactersA

Open the Google Flow Characters page and list existing characters.

Inputs: no named parameters.

flow_queue_statusA

Check the job queue: active job, pending queue, completed and failed job history.

Inputs: history_limit.

flow_screenshotB

Take a screenshot of the current Google Flow page.

Inputs: name.

flow_statusB

Check current connection status: browser connected, Flow page loaded, account verified, job queue state.

Inputs: full.

flow_use_grid_architectA

Open Grid Architect in Google Flow, fill theme prompt, shot prompts, engine, ratio, and visual logic settings. Supports batch shot generation for brand campaigns.

Inputs: theme_prompt (required), ratio, engine, campaign, +4 more.

flow_use_toolA

Open any tool by name in Google Flow and optionally fill its configuration parameters.

Inputs: tool_name (required), params, campaign, project_name.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 17 tools

    Disambiguation4/5

    Most tools target distinct operations, but there is some overlap between flow_status and flow_queue_status, and flow_use_tool potentially overlaps with specific tools like flow_use_grid_architect or flow_open_tools_gallery. However, the descriptions generally clarify the intended boundaries.

    Naming Consistency5/5

    All tool names follow a consistent flow_ prefix with snake_case verb/noun structure (e.g., flow_connect, flow_generate_image, flow_create_character). There are no mixed conventions or confusing naming patterns.

    Tool Count4/5

    At 17 tools, the set is slightly heavy but still reasonable for a browser automation server covering connection, UI discovery, generation, characters, scenes, and queue monitoring. Most tools appear to earn their place, though a few could potentially be consolidated.

    Completeness3/5

    Core workflows like connection, generation, and character/scene creation are covered, but there are notable gaps such as no update/delete operations for characters or scenes, no explicit scene listing, and no job cancellation or cleanup tool beyond disconnection. These omissions could limit full lifecycle management.

    Related MCP Connectors

    Related MCP Servers