Skip to main content
Glama

generate_image(prompt: "an orange fox on a white background", size: "1200x630")
-> images/an-orange-fox-on-a-white-background.jpg   1200x630   0 credits

Every image in this README was generated by this server. The banner above, the crops below, and the logo renders further down. Nothing was touched up by hand.


Why this one is different

Every other image MCP server bills you. You register for an API key, attach a credit card, and pay per image — a few cents each, which quietly becomes real money once a model is iterating on a design and throwing away nine attempts out of ten.

This one doesn't, because it isn't calling a paid API at all. It drives Nano Banana, the image model inside Google Flow, through the web app you already have access to. Flow charges credits for video. Images cost zero.

API-based image MCPs

nano-banana-mcp

API key

Required

None

Billing account

Required

None

Cost per image

Cents each, and it adds up

$0.00

Setup

Register, key, billing, secret

Sign into Google in a Chrome window

Exact pixel sizes

Rarely

Yes

Reference images

Sometimes

Yes

The trade-off is honest and worth stating: it needs a real Chrome window that you are signed into, so it can't run headless or in CI. That's the price of not having a bill.

Related MCP server: mcp-alphabanana

What it solves

Flow generates in five fixed aspect ratios: 16:9, 4:3, 1:1, 3:4 and 9:16. Real design work almost never lands on one of them — an Open Graph card is 1200×630, a repo banner is 1456×180, an avatar is 400×400.

This server generates at the closest native ratio and crops to the exact size, using saliency detection so the crop doesn't decapitate your subject. Ask for 1200x630, get a 1200×630 file.

What "exact size" does and doesn't mean. The model is not generating at your dimensions — Flow always returns its own native resolution, around 1 megapixel (1376×768 for 16:9, 1024×1024 for 1:1). The exact size is produced here, locally, by cropping and scaling that result. The file you get really is 1200×630; the pixels in it came from a 1376×768 render.

That's a genuine convenience when you're going down from native, which covers most web work. Going up it will still hand you the file you asked for — request 3000×3000 and you get 3000×3000 — but those extra pixels are interpolated, not generated. There is no more detail in them. The server prints a warning when this happens; if you need real resolution beyond native, upscale deliberately with a tool built for it.

One generation, three sizes. Same source image, cropped three ways — note how the crop follows the subject instead of blindly taking the centre:

1200x630 — Open Graph

400x400 — avatar

1456x180 — repo banner

Reference images

Give it an image and the prompt stops describing what to create and starts describing what to change. Feed it a flat logo and ask for it letterpressed into cotton paper, or cast as a matte signage object:

Left: the source vector, handed in as a reference. Centre and right: two generations from it, four variants each, 0 credits, about a minute per batch.

generate_image({
  prompt: "this logo letterpressed into thick warm off-white cotton paper, raking side light",
  reference_images: ["assets/logo.png"],
  count: 4
})

// iterating on the same reference? don't re-upload it
generate_image({
  prompt: "same, but with a deeper impression and visible paper tooth",
  reference_library_names: ["logo.png"],
  count: 4
})

Flow doesn't take a file straight into the composer: it uploads to the project library first, and you pick it from there. Both steps are handled for you, including the confirm click that actually attaches it. Any reference left over from a previous turn is cleared first — a forgotten one silently changes the image, and the result gets blamed on the prompt.

How it works

Flow has no public API. Its internal generation call is signed with a reCAPTCHA Enterprise token minted by the page's own JavaScript, so it cannot be replayed from outside the browser — and this project does not try to. That single constraint shapes the whole design.

So it does what a person would do: type into the composer and press Enter. What's different is how it reads the result.

It intercepts the page's own network response instead of watching the library for something new to show up. That response already carries the media id, the true dimensions and a signed URL, so there's no polling, no guessing which thumbnail is yours, and no ambiguity when several generations are in flight. The only fragile part left is typing the prompt.

One request, four responses. Ask for four variants and Flow doesn't return an array — it sends four separate HTTP responses, staggered by a couple of seconds. Waiting for "the next response" quietly drops three of them and looks exactly like an account limit. The collector listens to the whole stream and closes on whichever comes first: all expected images, a 20-second silence, or the hard timeout. It never discards what already arrived.

UI anchors are Material Symbols ligature names (crop_16_9, image, add_2) and numeric labels (16:9, x4). Those are identifiers, not translatable text, so it behaves the same whether the interface is in English, Spanish or Japanese.

The cost gate closes before sending. The server reads the cost Flow itself computes in its settings panel and aborts if it exceeds FLOW_MAX_COST, which defaults to 0. The refusal happens while refusing is still free. If the number can't be read, it doesn't send either — it won't guess.

Requirements

  • Node.js 20 or newer

  • Google Chrome

  • A Google account with access to Flow

That's the whole list. No API key, no cloud project, no billing account, no secret to rotate.

Install

git clone https://github.com/frannkurt/nano-banana-mcp.git
cd nano-banana-mcp
npm install
npm run build

Setup

1. Launch Chrome with remote debugging

Use a profile separate from your everyday one.

Windows

"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="%USERPROFILE%\.nano-banana-mcp\chrome" https://labs.google/fx/tools/flow

macOS

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 --user-data-dir="$HOME/.nano-banana-mcp/chrome" https://labs.google/fx/tools/flow

Linux

google-chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.nano-banana-mcp/chrome" https://labs.google/fx/tools/flow

2. Sign in and open a project

In that window, sign in with your Google account and open a Flow project. The URL must end up at labs.google/fx/tools/flow/project/<id>.

Without an open project there is no composer, and without a composer nothing can be generated.

3. Register the server

In Claude Code:

claude mcp add nano-banana --env FLOW_CDP_URL=http://127.0.0.1:9222 --env FLOW_OUTPUT_DIR=./images -- node /path/to/nano-banana-mcp/dist/index.js

Or by hand, in your MCP client's config:

{
  "mcpServers": {
    "nano-banana": {
      "command": "node",
      "args": ["/path/to/nano-banana-mcp/dist/index.js"],
      "env": {
        "FLOW_CDP_URL": "http://127.0.0.1:9222",
        "FLOW_OUTPUT_DIR": "./images",
        "FLOW_MAX_COST": "0"
      }
    }
  }
}

4. Check it

node scripts/doctor.mjs

That checks the browser, session, project, composer and balance in order, and stops at the first thing that's wrong with instructions for fixing it. Once it's clean, try a real generation:

node scripts/smoke.mjs "an orange fox on a white background" 1200x630

Tools

flow_status

Connection state: session, account, open project, credit balance. Start here when something fails.

generate_image

Parameter

Type

Default

What it does

prompt

string

Image description, in any language

size

string

native

Exact output size, "WIDTHxHEIGHT", e.g. "1200x630"

aspect

16:9 4:3 1:1 3:4 9:16

derived from size

Native ratio to generate at

count

1–4

1

How many variants

reference_images

string[]

Local paths to use as references; uploaded and attached for you

reference_library_names

string[]

Files already in the project library, attached without re-uploading

out_dir

string

FLOW_OUTPUT_DIR

Destination folder

basename

string

derived from prompt

Base filename

format

jpg png webp

jpg

Output format

fit

cover contain

cover

cover crops to fill, contain pads the edges

background

CSS color

#ffffff

Padding color when fit is contain

Returns the saved paths, each media id, and a thumbnail of every result — so the model can see what came out and decide whether it's worth another try.

generate_batch

Generates several different prompts at once — one browser tab per prompt, up to 4 jobs, each with its own optional size, aspect and basename. Shared out_dir, format, fit and background.

Chrome freezes requestAnimationFrame in background tabs, so the UI can only be driven in the frontmost one. The tool splits each job in two phases: the UI phase (settings + submit, a few seconds) runs one tab at a time, bringing each to the front; the wait for Flow's answer — which is what actually takes time — runs in parallel for all of them. Two jobs land in roughly the time of one and a half.

One failed job doesn't sink the rest: you get the saved files that worked and a per-job error for the ones that didn't.

list_library

Lists the images in the project library, newest first: uploads (with the exact filename reference_library_names expects) and generated images (with their prompt and media id). Read via the project API — no UI is touched. Filter with only: uploaded, generated or all.

download_image

Fetches an existing image by media id, with optional cropping (size, fit, background). Useful for recovering something generated earlier, or pulling several sizes out of the same original.

Configuration

Variable

Default

What it does

FLOW_CDP_URL

http://127.0.0.1:9222

Chrome's debugging endpoint

FLOW_OUTPUT_DIR

~/nano-banana-images

Where images are saved

FLOW_MAX_COST

0

Credit ceiling per generation

FLOW_GENERATE_TIMEOUT_MS

180000

How long to wait for Flow to answer

FLOW_LANG

system locale, else en

Language of this server's messages: en or es

Languages

Two different languages meet in this project, and it's worth not confusing them.

Flow's interface language is whatever your Google account is set to, and this server never depends on it. It anchors on Material Symbols ligature names (crop_16_9, add_2, image) and numeric labels (16:9, x4) — those are identifiers, not copy, so they read the same in every locale. It never matches translatable text like "Add to prompt". Tested against a Spanish interface; the anchors are language-independent by construction.

The one place that used to depend on it was reading the cost. That's now taken from the panel's structure — the leaf <a> element holding the number — instead of matching the word next to it. It matters because the cost gate refuses to send when it can't read the number, so a German user seeing "0 Punkte" would have been blocked from generating anything at all. Safe, but useless.

This server's own messages — errors, warnings, status, and the MCP tool descriptions your model reads — come in English and Spanish. It picks from FLOW_LANG, falling back to your system locale, defaulting to English.

FLOW_LANG=es node dist/index.js

Code comments stay in Spanish. That's a choice about how this codebase is written, not something a user ever sees.

Generating in parallel

The composer is a single element per tab, so two generations in the same tab overwrite each other's prompt. Give each worker its own tab and they don't collide — each waits for its own network response, so there's no question which image belongs to whom.

The generate_batch tool does this for you: up to 4 different prompts, one tab per prompt. There's one wrinkle worth knowing: Chrome freezes requestAnimationFrame in background tabs, so React stops responding to clicks in any tab that isn't frontmost. That's why each job's UI phase (settings + submit) runs one tab at a time, and only the wait for Flow's answer runs truly in parallel. The wait is where nearly all the time goes, so the speedup survives.

For scripts, the same two-phase split is available as a library API:

import { ensureFlowTabs } from "nano-banana-mcp/dist/browser.js";
import { startGeneration } from "nano-banana-mcp/dist/generate.js";

const tabs = await ensureFlowTabs(4);
const started = [];
for (const [i, prompt] of prompts.entries()) {
  await tabs[i].page.bringToFront();                  // UI phase: one at a time
  started.push(await startGeneration({ prompt, aspect: "16:9", count: 4, page: tabs[i].page }));
}
const results = await Promise.all(started.map((s) => s.harvest));  // the wait: all at once

Four tabs × four variants is sixteen images per cycle. In practice that's roughly 40 images in five minutes.

On cost

Images in Flow cost 0 credits. Video costs, and it costs a lot.

The gate described above is what keeps that true by accident rather than by trust: the server reads Flow's own quoted cost and refuses to send anything above the ceiling.

Roadmap

Video and scene generation are in development. Not shipped yet — today this server generates images only.

Video is where the cost gate stops being a formality, so it will land behind an explicit, non-zero FLOW_MAX_COST and a per-call confirmation. Nothing that spends credits will ever run because a default let it.

Privacy and credentials

  • It never handles a credential. It attaches to a session you opened yourself.

  • The balance is read with a token that is fetched and used inside the tab. That token never crosses into this process, is never written to disk, and is never logged.

  • Nothing is sent anywhere except Google Flow.

Troubleshooting

Run node scripts/doctor.mjs first — it checks the whole chain in order and stops at the first thing that's wrong. The messages below are the English ones; with FLOW_LANG=es you'll see the Spanish equivalents.

Known issue — Google is rolling out a new Flow interface. If generation fails with "Couldn't find the generation settings control on the page", and your Flow settings open as a full page with a tune button instead of a small popover, you have the new UI. It changes three things at once: the settings trigger, the panel (which no longer quotes a cost, so the cost gate refuses to send), and the generation endpoint itself. This is diagnosed in detail and being worked on in issue #1 — there's nothing to fix on your end yet. The rollout is gradual, so accounts still on the old interface are unaffected.

"Couldn't connect to Chrome at …" — Chrome isn't running with --remote-debugging-port=9222, or you launched it without its own --user-data-dir and it attached to an existing instance. Close every window of that profile and relaunch with the command above.

"No labs.google tab is open in that Chrome" — open Flow in that Chrome window.

"Couldn't find the prompt composer on the page" — you're on the project list, not inside a project. The URL must contain /project/.

"I couldn't read what this generation would cost, so I'm not sending it" — Flow's interface changed. If the text the error quotes mentions "Confirm before generating", that's the new UI: see the known issue above. Otherwise the error includes the text it did read; open an issue pasting it and it gets fixed in one place. Either way this is a refusal, not a crash: nothing was sent and nothing was spent.

"Couldn't find X in the library picker" — the reference file isn't in this project's library, or the name doesn't match. Check the exact filename as it was uploaded.

"Selected X in the library but it didn't attach to the composer" — the picker's confirm button moved. Open an issue with the Flow's interface changed template.

It generated but the crop is wrong — try fit: "contain", or pass an explicit aspect closer to your final size instead of letting it be derived.

Limitations

  • Images only. Video and scenes are in development, not available yet.

  • Needs a visible, signed-in Chrome window. It does not work headless or in CI.

  • It depends on Flow's interface to type the prompt. Google can change it; when they do, the submit step breaks and needs adjusting.

  • Not a Google product. Not endorsed by or affiliated with Google.

Contributing

Yes, please — see CONTRIBUTING.md. The most valuable contribution is a fix for a Flow UI change, and that guide explains how to diagnose one properly instead of guessing at selectors.

Also welcome: setup reports from macOS and Linux (this was built on Windows), and testing against interfaces in languages other than Spanish and English.

By participating you agree to the Code of Conduct. Security issues go here, privately.

License

Apache-2.0. See LICENSE and NOTICE.

Not a Google product. Not endorsed by or affiliated with Google.

Available Tools

5 tools
download_imageA

Download an image that already exists in Flow by its media id, with optional cropping to an exact size.

ParametersJSON Schema
NameRequiredDescriptionDefault
fitNocover
sizeNoExact size, "WIDTHxHEIGHT" format.
media_idYesMedia id, as returned by generate_image.
out_fileYesOutput path. The extension decides the format.
backgroundNoPadding color for fit="contain", as a CSS color ("#0f172a", "black"). White by default.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It correctly communicates a non-mutating download action and optional cropping, but it does not disclose details such as whether an existing out_file is overwritten, how missing or invalid media_id values are handled, or other runtime side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that states the action, the resource scope, and the optional crop capability. No wasted words and no unnecessary repetition of schema-provided details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The combination of description and rich schema covers the necessary invocation path: media_id identifies the image, out_file defines the destination, and size/fit/background control cropping. It is missing only minor behavioral caveats about failures and overwriting, but those are not essential to correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, and most parameters already have substantive descriptions such as 'WIDTHxHEIGHT format' and 'The extension decides the format.' The description adds minor semantic value by mentioning 'optional cropping to an exact size,' but the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Download an image that already exists in Flow by its media id.' This clearly distinguishes it from siblings such as generate_image or generate_batch, which create images, and from flow_status or list_library, which inspect state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'already exists in Flow' and 'by its media id' signal that this is the retrieval step after generation, not a generation tool. It does not explicitly name alternatives or exclusions, but an agent can infer the appropriate context without ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

flow_statusA

Check the connection to the Google Flow Chrome window: signed-in session, account, open project and credit balance. Call this first when something fails.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It reveals that the tool checks connection-related details and implies a read-only operation, but it does not describe side effects, error handling, or return format. It adds some context beyond a bare 'check status' but lacks deeper behavioral specifics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: one sentence specifying the check and one giving usage guidance. It is front-loaded with the action and scope, with no redundant wording or unnecessary details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity (no params, no annotations) and lack of output schema, the description is somewhat complete but misses return value information. It tells the agent what is checked and when to call it, but it does not explain what the tool returns or how to interpret the result, which would be valuable since there is no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the input schema is empty. The baseline for 0 params is 4, and the description does not need to explain parameter semantics. It appropriately focuses on the tool's purpose rather than parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks a connection to the Google Flow Chrome window, detailing specific aspects (signed-in session, account, open project, credit balance). This specific verb-resource combination distinguishes it from sibling tools like generate_image and download_image, which serve entirely different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: 'Call this first when something fails.' This tells the agent when to use the tool, but it does not mention when not to use it or suggest alternative tools. Still, the clear directive covers a key usage scenario.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_batchA

Generate several DIFFERENT prompts at once, one browser tab per prompt, in parallel. Much faster than calling generate_image repeatedly. Up to 4 jobs; each can have its own size and filename. Reference images are not supported here — use generate_image for that.

ParametersJSON Schema
NameRequiredDescriptionDefault
fitNoHow to fit into `size`: "cover" crops to fill, "contain" fits everything and pads the edges.cover
jobsYesThe jobs to run in parallel. Each needs a prompt; size (e.g. 1200x630), aspect and basename are optional per job.
formatNoOutput format.jpg
out_dirNoDestination folder. Defaults to FLOW_OUTPUT_DIR.
backgroundNoPadding color for fit="contain", as a CSS color ("#0f172a", "black"). White by default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the disclosure burden. It usefully reveals parallel execution, one browser tab per prompt, a 4-job limit, and the lack of reference-image support. It does not describe whether the call waits for completion or what it returns, but the behavioral character is mostly clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three tight sentences with no filler: it states what the tool does, how it behaves, when it is faster, what limits apply, and which sibling to use instead. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The input side is thoroughly covered by the schema and the description, and the sibling relationship is clear. However, since there is no output schema, the description should state what the call produces or returns, and whether it blocks until images finish generating. That gap prevents full contextual completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are already well documented there. The description adds at most a reminder that each job can carry its own size and basename, but it does not materially deepen the parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies a clear verb and resource: generate several different prompts at once, in parallel, with one browser tab per prompt. It also explicitly distinguishes this tool from generate_image, which removes any ambiguity about its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: use this when generating multiple prompts in parallel because it is much faster than repeated calls, and explicitly tells the agent to use generate_image when reference images are involved. This makes the routing decision straightforward.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_imageB

Generate one or more images with Google Flow and save them to disk. You can ask for an exact pixel size (e.g. 1200x630): it generates at the closest native aspect ratio and crops to the size you asked for. Images cost no credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
fitNoHow to fit into `size`: "cover" crops to fill, "contain" fits everything and pads the edges.cover
sizeNoExact output size, "WIDTHxHEIGHT" format, e.g. "1200x630". Omit to use the native size.
countNoHow many variants to generate (1 to 4).
aspectNoNative aspect ratio. If omitted and `size` is given, the closest one is chosen.
formatNoOutput format.jpg
promptYesImage description. In any language.
out_dirNoDestination folder. Defaults to FLOW_OUTPUT_DIR.
basenameNoBase filename. Derived from the prompt by default.
backgroundNoPadding color for fit="contain", as a CSS color ("#0f172a", "black"). White by default.
reference_imagesNoLocal paths to images to use as references. Flow starts from them instead of from scratch, so the prompt describes what to change rather than what to create. Useful for versioning a logo, iterating on a previous result, or holding a style across pieces.
reference_library_namesNoFilenames ALREADY in the project library, to attach without uploading them again. Use this when iterating on the same reference: re-uploading the same file only leaves duplicate rows in the library and makes each generation slower.

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses two genuinely non-obvious traits: the closest-native-aspect-ratio-and-crop behavior for exact sizes, and the zero-credit cost. However, it reveals no side effects such as where files land, how long generation may block, or what the invocation returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the main verb and outcome, the size/cropping behavior, and the cost call. The size example is front-loaded as the most decision-relevant detail. There is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An 11-parameter tool with no output schema and no annotations needs more than this. The description covers only purpose and size behavior; it says nothing about count variants, reference-based iteration workflows, output format, the destination folder default, or what the tool returns after saving files. These are meaningful gaps for an agent planning a real task.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 does add a unifying model of how size, aspect, and fit interact (generate at the closest native AR, then crop), which goes slightly beyond restating individual fields, but most parameter meaning is already fully captured in the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource, 'Generate one or more images with Google Flow and save them to disk', which clearly states the core action and output. It implicitly contrasts with flow_status and download_image, but it does not disambiguate from the closely named sibling generate_batch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no explicit when-to-use guidance and names no alternatives. The 'costs no credits' note is a useful decision signal, and the size/crop behavior aids usage, but nothing tells an agent when to choose this over generate_batch or download_image.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_libraryA

List the images in the Flow project library: uploads (reusable via reference_library_names without re-uploading) and generated images (re-downloadable by id with download_image).

ParametersJSON Schema
NameRequiredDescriptionDefault
onlyNoFilter: "uploaded" (reference uploads), "generated", or "all".all

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does usefully explain the two library categories and the relationship to upload reuse and download. However, it remains silent on other behavioral aspects such as whether the operation is read-only, what fields are returned, ordering, pagination, or authentication requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single well-formed sentence structured with a colon and parentheticals, making it dense but highly scannable. Every clause adds distinct information, and the most important action is front-loaded. There is no filler or repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple tool shape — one optional filtered parameter with full schema coverage and no output schema — the description provides sufficient context for the primary action and meaningful notes on how the listed images can be used. It does not need to restate the filter enum because the schema already documents it, and the parenthetical references to reference_library_names and download_image anticipate follow-up actions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 100% of the parameter, so the baseline is 3. The description also adds meaning to the enum categories by explaining what 'uploads' and 'generated images' signify in terms of reusability and downloadability. The description goes beyond a bare enum listing without repeating schema details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Begins with an explicit verb and resource: 'List the images in the Flow project library.' The description clearly splits the content into uploads and generated images, and by referencing download_image it distinguishes this listing tool from the retrieval sibling. An agent can immediately tell what the tool does and how it connects to the other tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied rather than explicitly stated. The description explains that uploads can be reused via reference_library_names and generated images can be re-downloaded with download_image, but it never directly says 'use this when you need to see available images' or contrasts list_library with generate_image/generate_batch. This leaves usage timing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4/5.0
Disambiguation5/5

flow_status, generate_image, and download_image each have clearly distinct purposes: checking connection state, creating new images, and fetching existing images. There is no overlap between them, so an agent can easily select the right tool.

Naming Consistency4/5

All names use lowercase with underscores, but two are verb_noun (generate_image, download_image) while flow_status is noun_noun. This is a minor inconsistency, but the pattern is otherwise predictable and readable.

Tool Count5/5

Three tools is well-scoped for a single integration focused on Google Flow image generation. Each tool has a clear role, and nothing feels extraneous or missing at a high level.

Completeness4/5

The core workflow of checking status, generating images, and downloading them is covered. However, the set lacks listing or deleting existing images, which could be a minor gap if agents need to manage existing media without knowing its ID.

Maintenance

ActivityMaintained
ResponsivenessSyncing

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

Related MCP Servers

Latest Blog Posts

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/frannkurt/nano-banana-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server