flow-mcp
Provides tools for interacting with Google Flow (labs.google/fx/tools/flow) to generate images and videos, manage media status, download results, and create character entities, all without API keys by leveraging a local Chrome session via CDP.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@flow-mcpGenerate a 16:9 image of a cyberpunk street"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
flow-mcp — Google Flow MCP Server
A standalone MCP server for Google Flow (split off from media-gen-mcp): 0-credit AI image generation + billed video generation (Veo / abra), all driven through your local Chrome session (CDP page context) — no API key, no quotas, no third-party relay.
Image generation / image upscaling / upload / status query / download / delete / share / cancel / character entities: all 0 credits
Video generation: consumes Google Flow credits (abra 7-20 / veo lite 10 / fast 20 / quality 100 per item; 1080p upscaling 0) — explicitly warned in the tool description, used by default only when the user explicitly asks
Installation
Prerequisites (one-time):
Install lasso locally (the Chrome launcher in the CC full-interaction harness)
Launch Chrome with CDP and sign in to labs.google:
lasso launch-chrome --port 9223 --mode visible # 首次:窗口出现,完成 Google 登录(2FA 同)
# 之后每天只需:hidden 模式静默驻留
lasso launch-chrome --port 9223Open any project page at https://labs.google/fx/tools/flow in that Chrome (keep it running)
Connect to Claude Code:
claude mcp add flow-mcp -- node /path/to/flow-mcp/dist/index.js
# 或发布后:npx flow-mcp-serverCan be connected alongside media-gen-mcp without conflicts (see "Coexistence with media-gen-mcp" below).
Related MCP server: Grok Image Generation MCP Server
Tools (4)
Tool | Credits | Purpose |
| 0 | Text-to-image / image-to-image (base image + reference image) / 2K upscaling. NARWHAL (Nano Banana 2, default) / HARBOR_SEAL / GEM_PIX_2 (Nano Banana Pro). Supports |
| 🔴 Billed | Video submission (t2v/i2v/r2v/first-last frames/extend/edit/upscale). Submit only, no waiting — returns a mediaId handle immediately |
| 0 | One-stop introspection: credit balance / live model catalog (credit price and latency per key) / media list / single-media status and download / batch delete / public share links / cancel in-progress tasks. Also the polling path for video handles |
| 0 | Character entities: create character card / bind one of 30 preset voices / bind appearance image |
Typical flow:
flow_status # 先看:余额 + 目录(per-key creditsAtServiceTier)
flow_generate_image(prompt=..., aspect="16:9") # 0 积分生图,产出落盘并回传 mediaId+seed
flow_generate_video(model="abra_t2v_8s", ...) # 🔴 计费提交 → 返回 mediaId 句柄(不阻塞)
flow_status(mediaId="...") # 轮询(0 积分;in_progress 会给 retry_after_seconds)
flow_status(mediaId="...", download=true) # completed 后落盘 mp4Configuration (shares one file with media-gen-mcp)
Config file: ~/.media-gen-mcp/config.json (both packages read the same file — "different implementation channels for the same feature" are enabled/disabled uniformly in one file). The directory name follows the historical name, do not change it (the Flow project ID is permanently recorded in ~/.media-gen-mcp/flow-project.json; renaming would orphan it).
{
"flow": {
"enabled": true,
"imageRouting": "prefer",
"videoRouting": "explicit-only",
"toolDeadlineMs": 110000
},
"providers": {
"flow": { "cdpPort": 9223 }
}
}Field | Default | Purpose |
|
|
|
|
|
|
|
|
|
|
| Hard cap for a single tool call (prevents hangs; on timeout returns |
|
| CDP port (matches |
| (default) | When absent, reads the permanent project from |
| (none) | Deliberately no built-in default: video is billed, so |
See config.example.json for a full example.
Coexistence with media-gen-mcp
Both packages share
~/.media-gen-mcp/config.json; media-gen's ownimageProviderPriority/videoProviderPrioritychain only takes effect within its own packageAfter the split, cross-package priority = this package's tool-description soft routing (
imageRouting/videoRoutingguide Claude to preferflow_generate_image) + theenabledmaster switch — there is no cross-package hard redirect (the two packages are physically invisible to each other; an honest design)flow-project.json/flow-entities.jsonbelong to this package; after Flow is removed from the media-gen side, it no longer reads or writes them
Error code quick reference ([flow] S<code>)
Code | Meaning | Resolution |
| Config disabled | Follow the guidance in the error to set |
| CDP unreachable |
|
| No labs.google page | Open the Flow project page in that Chrome |
| Not signed in | Complete the labs.google sign-in in that Chrome |
| reCAPTCHA failed | Stay on the Flow page and retry |
| Environment prerequisite | Retry once the environment is ready; image generation can fall back to other image tools |
| Page fetch failed | Check the upstream response snippet in the message |
| Model/parameter/mode validation | Follow the message guidance to change the key or parameters (intercepted before submission, zero cost) |
| mediaId not in this project | Call |
| Incomplete download | Just retry |
| Tool-layer deadline (anti-hang) | Generation is still running server-side; recover via |
Environment requirements
Node.js ≥ 18
Local Chrome (launched via lasso with
--remote-debugging-port=9223) signed in to labs.googleFFmpeg bundled with the package (ffmpeg-static; used only for output validity self-check, automatically degrades to a notice when missing)
License
MIT
Available Tools
4 toolsflow_entityA
Google Flow character entities (角色实体, ZERO-CREDIT). Create/update CHARACTER entities and bind a preset voice for later audio/character generation. Create: tRPC flow.createEntity {projectId, collectionId:""} (empty string passes zod — no collection needed); update: PATCH /v1/flow/entities with dotted updateMask (displayName / characterInfo.audioReferences=[{presetVoiceId}] / characterInfo.imageReferences=[{workflowId}]). Entity images attach via imageMediaIds (completed image mediaIds from flow_generate_image; the workflowId mapping is resolved automatically from project workflows). 30 preset voices are star-named (achernar/charon/kore/…) with descriptions — list them via action=voices or flow_status preset_voices.
LIMITATION (honest): Flow has NO entity read endpoint (projectContents has no entities key; collections REST is CORS-blocked in page context) — only entities created via this tool are tracked, in a local mirror ~/.media-gen-mcp/flow-entities.json (aligned with flow-project.json precedent). action=list returns the mirror, not a server query.
WHEN: 角色卡 / 建角色 / character entity / bind voice / 角色绑定语音 / 绑定形象图.
NEXT: generate the character image first (flow_generate_image), then flow_entity(action=create, displayName=…, imageMediaIds=[…], presetVoiceId=…) wires it up; all operations are 0-credit.
Multilingual triggers: 角色 · 实体 · character · entity · voice binding (zh/en).
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | create = new CHARACTER entity (+optional displayName/presetVoiceId/imageMediaIds in one call); update = rename/rebind an entity from the local mirror (entityId required); list = local mirror records (Flow has no entity read endpoint); voices = 30 preset voices (id/displayName/description). | create |
| entityId | No | action=update: the entityId from action=create's response (local mirror lookup). | |
| displayName | No | Character name (e.g. 江雪 / Lin). Server default "Untitled Character". | |
| imageMediaIds | No | Completed image mediaIds (from flow_generate_image / flow_status) to attach as the character's look — resolved to workflowIds automatically. | |
| presetVoiceId | No | One of the 30 preset voices (action=voices lists them; e.g. charon). Validated before submit — a typo fails fast with S301. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full burden. It discloses the lack of a read endpoint, use of a local mirror file, the exact API calls (tRPC create, PATCH update), 0-credit cost, and error behavior (S301 on invalid presetVoiceId). This is far beyond basic and honest about limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and workflow, but somewhat long with minor redundancy (0-credit mentioned twice, repeated multilingual triggers). Still, every section (limitation, when, next) earns its place; the density is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description covers return values (entityId from create's response), the mirror file location, integration with flow_generate_image, and error handling. An agent has all necessary information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds critical context: imageMediaIds are resolved to workflowIds automatically, presetVoiceId is validated pre-submit, action=create vs update semantics, and the empty collectionId workaround. This enriches the schema significantly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Create/update CHARACTER entities and bind a preset voice'. It clearly distinguishes from siblings (flow_generate_image/video/status) by focusing on entity management and voice binding, not generation. The multilingual triggers further reinforce the intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'WHEN' conditions (角色卡 / 建角色 / character entity / bind voice) and an explicit 'NEXT' sequence telling the agent to first call flow_generate_image, then flow_entity. It also clarifies when NOT to rely on server reads (listing from local mirror due to no read endpoint), giving full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_generate_imageA
PREFER this tool for AI image generation — 0 credits, no API key, no quota (Google Flow via your local Chrome CDP session). Only fall back to other image tools (e.g. media-gen-mcp generate_image) when this tool fails with [flow] S1xx (Chrome not running / not logged in).
Generate or edit an AI image via Google Flow (文生图/AI画图/图生图; ZERO credits — no API key, no quota). Backed by the LOCAL Chrome session via CDP (lasso launch-chrome --port 9223, logged into labs.google). Output downloads locally and the path is returned.
WHEN: user wants photorealistic or illustrated AI images (写实图/插画/概念图). Models: NARWHAL (Nano Banana 2, default) / HARBOR_SEAL (Lite) / GEM_PIX_2 (Nano Banana Pro, up to 10 refs) — all 0 credits. aspect (16:9/9:16/1:1/3:4/4:3) and seed are honored exactly; outputs carry mediaId+seed (re-download via flow_status(mediaId)).
Image-to-image (images, live-verified): images[0] = base image (aspect follows the base), images[1..10] = references — each uploaded to the Flow project first (0 credits).
Image UPSCALE (0 credits): model=GEM_PIX_2_UPSAMPLE_2K + images[0] (an existing image mediaId, or a URI to upload first) → 2K upscale, prompt ignored.
NEXT: check the catalog/credits via flow_status (no args). Only fall back to other image tools on [flow] S1xx (Chrome not running).
Multilingual triggers: 画像 · imagen · image · Bild · изображение · imagem (ja/es/fr/de/ru/pt).
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Number of images (1-8). Provider API ignores batch n, so the tool fans out N sequential submissions; partial success returns fewer + a `warnings` field. | |
| name | No | Output filename (without extension); multi-image adds -1/-2/… suffix. Defaults to img_<uuid>. | |
| seed | No | Seed for reproducible results — goes straight into the request; the response echoes the actual per-image seed. | |
| size | No | e.g. 1024x1024. Maps to the nearest of 5 aspect ratios (1920x1080→16:9 / 720x1280→9:16 / 1024x1024→1:1 / 768x1024→3:4 / 1024x768→4:3); pass `aspect` for an exact ratio. | |
| model | No | Optional; default NARWHAL. GEM_PIX_2_UPSAMPLE_2K = 2K UPSCALE mode (requires images[0] = an existing image mediaId or a URI; 0 credits, prompt ignored). | |
| aspect | No | Direct aspect ratio — maps to Flow IMAGE_ASPECT_RATIO_*; exact, no size guessing. Ignored (with a warning) when a base image is given (aspect follows the base). | |
| images | No | Image inputs (public URL or data URI). images[0] = base image, images[1..10] = references. For UPSCALE (GEM_PIX_2_UPSAMPLE_2K) images[0] may be an existing image mediaId. | |
| outDir | No | 产物落盘目录,省略用默认(会话目录/output)。 | |
| prompt | Yes | Image description. | |
| download | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it excels. It discloses zero credit usage, no API key/quota, local Chrome CDP session, local output download with returned path, exact aspect/seed honoring, per-image mediaId+seed in output, re-download via flow_status, image-to-image behavior, upscale mode (prompt ignored), and fallback behavior on S1xx errors. This is far beyond what annotations alone would provide, offering deep behavioral insight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (~600 words) but well-structured with bolded lead-ins (PREFER, WHEN, Image-to-image, UPSCALE, NEXT, Multilingual). It is front-loaded with the most critical info (0 credits, fallback condition). Every section serves a purpose given the tool's multiple modes. It's not overly verbose for its complexity, though it could be trimmed slightly (e.g., the multilingual list is somewhat tangential). Overall, good structure earned a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three distinct modes (txt2img, img2img, upscale) and fallback logic, the description is remarkably complete. It covers purpose, usage, exclusions, behavioral details, parameter nuances, output handling, and how to check status via flow_status. With no output schema and no annotations, this description leaves little for the agent to guess. It fully equips the agent to call the tool correctly in all scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 90%, so the baseline is 3. The description adds significant value beyond the schema: it names the three models with their aliases (NARWHAL/Nano Banana 2, HARBOR_SEAL/Lite, GEM_PIX_2/Nano Banana Pro with up to 10 refs), clarifies that aspect is honored exactly (schema says 'Maps to nearest' but description says 'exact'), explains images[0] as base image and images[1..10] as references, and details upscale mode prerequisites. It doesn't cover every parameter (e.g., outDir, download), but the schema already does. The added model semantics and mode behavior justify a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool's purpose: 'Generate or edit an AI image via Google Flow' with a specific verb and resource. It differentiates itself from siblings by naming flow_generate_video, flow_status, and flow_entity implicitly (it's the image-specific one) and explicitly mentions the alternative media-gen-mcp generate_image. The opening 'PREFER this tool for AI image generation' makes its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance: 'WHEN: user wants photorealistic or illustrated AI images.' It also provides explicit exclusion criteria: 'Only fall back to other image tools... when this tool fails with [flow] S1xx.' It even instructs the agent to check flow_status first and mentions multilingual triggers for intent detection. This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_generate_videoA
🔴 BILLS GOOGLE FLOW CREDITS (abra 7-20 / veo lite 10 / fast 20 / quality 100 per clip; upsampler_1080p = 0). USE ONLY when the user explicitly asks for Flow / Veo / abra video (config flow.videoRouting=explicit-only — the default, credits red line).
Submit an AI video generation to Google Flow (文生视频/图生视频/首尾帧/参考图/延长/编辑/超分). SUBMIT-ONLY: returns a mediaId handle immediately (never blocks ~2-4min generation) — poll with flow_status(mediaId=…) until status=completed, then re-call with download=true to save the mp4.
Model = full usage key (live catalog via flow_status): t2v (text) / i2v (+image) / r2v (+images 1-10) / interpolation or _fl (+keyframes exactly 2) / extension (+videoMediaId, e.g. veo_3_1_extension_lite) / upsampler (+videoMediaId, veo_3_1_upsampler_1080p = 0 credits; 4k tier-locked) / edit (+videoMediaId + prompt = the edit instruction, abra_edit 20 credits, wire probe-verified). Mnemonic + durationSeconds also works (abra_t2v + 8 → abra_t2v_8s). durationSeconds ∈ {4,6,8,10}s (off-grid snaps nearest), ratio 16:9/9:16 only, ONE clip per call — repeat calls for x2-x4 (each bills credits and gets its own seed).
NEXT: flow_status (no args) for the live catalog with per-key creditsAtServiceTier before choosing a key; after submit, flow_status(mediaId=…) { download: true } polls & fetches.
Multilingual triggers: 動画 · vídeo · vidéo · Video · видео · vídeo (ja/es/fr/de/ru/pt).
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | Seed for reproducible results (random when omitted; echoed in raw). | |
| image | No | image-to-video: single image URL (http(s)/data:) — START_IMAGE, upload (0 credits) then submit; requires an i2v key (e.g. abra_i2v_8s / veo_3_1_i2v_lite). A t2v key + image → structured S301 telling you the key to use. | |
| model | No | REQUIRED unless configured in config.json providers.flow.models.video.default (deliberately no built-in default — video costs credits). Full usage key (e.g. abra_t2v_8s / veo_3_1_t2v_lite / veo_3_1_upsampler_1080p) or mnemonic+durationSeconds (abra_t2v + 8). Complete live catalog in flow_status. | |
| ratio | No | Video aspect ratio (16:9 default). Image ratios 1:1/4:3/3:4 are NOT supported for video (image generation supports them). | |
| images | No | Reference images: 1-10 image URLs (http(s)/data:) for r2v keys (e.g. abra_r2v_8s / veo_3_1_r2v_lite) — uploaded (0 credits) then submitted as referenceImages. Mutually exclusive with image/keyframes/videoMediaId. | |
| prompt | Yes | Video content description (for edit keys: the edit instruction, e.g. "make it snow"). | |
| frameRate | No | 固定 24(Flow 唯一帧率;schema 展示与约束同源)。 | |
| keyframes | No | Exactly 2 images (first + last frame; http(s)/data:), requires an interpolation/_fl key (e.g. veo_3_1_interpolation_lite / veo_3_1_i2v_s_fast_fl); other counts or key families → structured S301. | |
| numFrames | No | Allowed: 96/144/192/240 @24fps (96/144/192/240 = 4/6/8/10s). Prefer durationSeconds (native Flow semantics). Mutually exclusive with durationSeconds. | |
| videoMediaId | No | mediaId of an EXISTING completed video in the Flow project (see flow_status) as the source for extension keys (veo_3_1_extension_lite, 10 credits), V2V edit (abra_edit, 20 credits) or the 0-credit upscaler (veo_3_1_upsampler_1080p) — references the generated video directly, no re-upload. Images/in-progress ids → structured S301. | |
| durationSeconds | No | Legal set {4,6,8,10}s — off-grid values snap to the nearest with a warning (5→4s, 12→10s). Mutually exclusive with numFrames. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full behavioral burden, and it does: it discloses credit costs per model, submit-only async behavior, the mediaId handle return, polling requirements, off-grid duration snapping, aspect ratio constraints, and structured error behavior for invalid inputs. This is unusually transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense, with the most critical warning (credit cost) front-loaded in red. Each sentence serves a purpose: mode list, submit-only behavior, model key syntax, next steps, multilingual triggers. The structure is logical, though the sheer density might overwhelm some agents; still, it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with no output schema, the description covers all necessary context: every mode, parameter interactions, credit implications, async flow, polling, language triggers, and even the live catalog via flow_status. It leaves no obvious gap in what an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining the model key semantics (mnemonic+durationSeconds, credit tiers), the exact usage of videoMediaId for each mode, and mutual exclusivity rules (image vs keyframes vs videoMediaId). It does not repeat schema descriptions but complements them with operational context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states an explicit verb+resource ('Submit an AI video generation to Google Flow') and distinguishes it from siblings by detailing the video-specific modes (t2v/i2v/r2v/interpolation/extension/upsampler/edit) and the explicit-only routing rule. It clearly differentiates from flow_generate_image and flow_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('USE ONLY when the user explicitly asks for Flow / Veo / abra video') and when-not-to-use via the config note. It also tells the agent the exact follow-up sequence (poll with flow_status, re-call with download=true) and lists alternative tools implicitly by covering all video generation paths.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_statusA
Google Flow introspection / media status / download / delete / share / cancel (ZERO-CREDIT; 零消耗自省/状态查询/媒体下载/媒体删除/分享链接/取消生成) — ALSO the polling path for flow_generate_video handles. Backed by the LOCAL Chrome session via CDP (lasso launch-chrome --port 9223, logged into labs.google) — every call runs as page-context fetch, no API keys needed. With NO mediaId: full snapshot (login email, credits balance, dynamic image/video model catalog with per-key creditsAtServiceTier + generationTimeSeconds, 30 preset voices, project media list). With mediaId: one media's generation status (+ download the finished mp4/png locally). With deleteMediaIds: batch-delete project media (0 credits, IRREVERSIBLE — keeps polling payloads small). With shareMediaIds: create public share links (0 credits). With cancelMediaIds: cancel in-flight generations (0 credits). NEVER submits generation — video/image submission goes through flow_generate_video / flow_generate_image (video costs credits: abra 7-20, veo lite 10 / fast 20 / quality 100 per clip; images & upscaling are 0-credit).
WHEN: preflight before generation; poll a submitted mediaId (the async handle from flow_generate_video); fetch an already-generated asset; check remaining credits; clean up accumulated media; share a result; cancel a wrong submission before it finishes.
NEXT: flow_generate_video(model="abra_t2v_8s") submits → returns mediaId handle; flow_status(mediaId=…) tracks it (in_progress → retry_after_seconds); status=completed + download=true saves the mp4.
Multilingual triggers: flow 状态 · flow 积分 · Flow status (zh/en).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Output filename (without extension). Defaults to flow_<mediaId-prefix>. | |
| outDir | No | 产物落盘目录,省略用默认(会话目录/output)。 | |
| mediaId | No | One media's generation status (+ local download when completed and download!=false). | |
| download | No | With mediaId: save the finished asset locally (mp4/png by content-type). Default false for fast polling; pass true once status=completed. | |
| thumbnail | No | With mediaId+download: fetch the server-generated JPEG thumbnail instead of the raw asset (raw video bytes ≠ thumbnail bytes; no S402 false positive by design). | |
| shareMediaIds | No | Create PUBLIC share links for these project media (0 credits; tRPC flow.share.shareMedia → mediaShareId). Returns shareUrl per media: https://labs.google/fx/tools/flow/shared/{image|video}/<mediaShareId> (prompt included). Mutually exclusive with mediaId/deleteMediaIds/cancelMediaIds. | |
| cancelMediaIds | No | CANCEL in-flight VIDEO generations for these mediaIds (0 credits; POST /v1/flowMedia:cancelGeneration body {mediaId}). Only in_progress media are submitted — completed/failed are reported as notCancelable; status re-checked after (expect MEDIA_GENERATION_STATUS_CANCELED). LIVE-VERIFIED BOUNDARY: image in-flight cancel returns 404 (images are not cancelable); video E2E cancel is wire-verified but not yet live-submitted. Mutually exclusive with mediaId/deleteMediaIds/shareMediaIds. | |
| deleteMediaIds | No | Batch-DELETE these project media (0 credits, IRREVERSIBLE 不可恢复; POST /v1/flow:batchDeleteAssets). Any unknown id → the whole batch is refused (S400, nothing deleted). Mutually exclusive with mediaId/shareMediaIds/cancelMediaIds. Use to keep the polling payload small. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the full burden, and it delivers richly. It discloses the zero-credit cost model, the local CDP-backed architecture (no API keys), IRREVERSIBLE delete semantics, the thumbnail S402 false-positive by design, and live-verified boundaries (image in-flight cancel returns 404; video cancel wire-verified but not live-submitted). This goes well beyond what structured annotations would typically provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the tool genuinely implements six distinct modes within one schema, so the length is justified. Critical constraints (zero-credit, irreversibility, never-submits-generation) are front-loaded in the first sentence block. Minor deduction: the architecture/CDP explanation and multilingual triggers are secondary details that could sit lower without losing the core guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 optional params, 6 modes, and no output schema, the description is remarkably complete: it names the backend endpoints invoked (tRPC flow.share.shareMedia, POST /v1/flowMedia:cancelGeneration, POST /v1/flow:batchDeleteAssets), documents the share URL format, and gives expected status transitions (in_progress → retry_after_seconds, MEDIA_GENERATION_STATUS_CANCELED). The lack of an output schema pushes more responsibility onto the description, which it mostly meets; brief mention of the full snapshot fields and status=completed contract covers it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds genuine value beyond the schema: mutual-exclusivity relationships among mediaId/deleteMediaIds/shareMediaIds/cancelMediaIds, the batch-delete all-or-nothing behavior (S400 on unknown id), the download=false default for fast polling, and the cancel re-check expectation. These cross-parameter semantics are not expressible in the input schema, so the description earns an above-baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (Google Flow), a clear verb set (introspect/status/download/delete/share/cancel), and explicitly differentiates from siblings: 'NEVER submits generation — video/image submission goes through flow_generate_video / flow_generate_image.' The multi-mode nature is clearly delineated, and an agent can immediately tell this is the management/polling counterpart to the generation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
An explicit WHEN section lists the six trigger conditions (preflight, poll mediaId, fetch asset, check credits, clean up, share, cancel). The NEXT section describes the full generation-to-polling workflow with the sibling tool, and the description states exclusions ('NEVER submits generation'). Routing between this and the generation siblings is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
4 tool updates
v0.1.0- First observed
flow_entity - First observed
flow_generate_image - First observed
flow_generate_video - First observed
flow_status
TDQS
Each tool has a completely distinct purpose: video generation, image generation, status/introspection (including download/delete/share/cancel), and character entity management. There is zero overlap or ambiguity between them, even for an agent scanning descriptions.
All tools share the 'flow_' prefix, creating a clear namespace. Two tools use verb_noun (flow_generate_video, flow_generate_image) while the others are simply noun-like (flow_status, flow_entity), but the pattern is still predictable and readable. Minor deviation from a strict verb_noun convention.
Four tools is on the small side but well-suited for a focused media-generation server. Each tool covers a necessary capability (generate video, generate image, manage/inspect, and entity handling). The count feels slightly thin but not incomplete for the domain.
The surface covers the full lifecycle: generation (video/image), status polling, download, delete, share, cancel, and entity CRUD (via flow_entity and flow_status). Minor gaps exist (e.g., no explicit list/update for media aside from status, but those are handled through flow_status arguments), so agents can accomplish all expected workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Generate AI images, videos, music, SFX & speech in any AI assistant. Results appear inline in chat.
Generate text, images, speech, music, and video with any AI model, from one credit balance.
Create images and videos from prompts, with options for image mixing, reference images, and start/…
Generate images with your own ChatGPT subscription (Plus, Pro or Team), without spending API credits
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables high-quality AI video generation using Google's Veo 3.1 model for text-to-video, style-guided, and frame-interpolation tasks. It features token-efficient reference image handling, batch processing, and video extension capabilities with built-in cost estimation.62-
- FlicenseNot gradedqualityFmaintenanceEnables AI assistants to generate images via Grok Imagine by automating the web interface through a Chrome extension bridge.1-
- AlicenseAqualityAmaintenanceEnables AI image generation and editing using Google's Gemini Multimodal Image APIs.61MIT
- AlicenseAqualityDmaintenanceEnables image generation, editing, and analysis using Google's Gemini 2.5 Flash and Gemini 3 Pro models, with support for batch processing, style templates, and high-resolution output.87581MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/wangdong233/flow-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server