Skip to main content
Glama
mordor-forge

gemini-media-mcp

by mordor-forge

gemini-media-mcp

CI Go License

An MCP server for Google's generative media models: images (Nano Banana 2.1 / Pro), video (Veo 3.1 and Gemini Omni Flash), speech (Gemini 3.8 TTS) and music (Lyria 3.5). It ships as a single Go binary, speaks stdio and Streamable HTTP (MCP 2026-07-28), works with the Gemini API or Vertex AI, and comes with agent skills that teach agents the whole workflow, plus plugin packaging for Claude Code, Codex, Gemini CLI, VS Code/Copilot, Cursor and more.

https://github.com/user-attachments/assets/f46970b3-82a6-4364-a40a-922103dbbc70

An agent using the server one tool at a time: images and edits, a video clip and its claymation restyle, a 768 px portrait tiled up to 8K, and an extended shot. The footage, the narration and the music all came from the server.

  • Current models, updated without a release. A built-in catalog records IDs, aliases, lifecycle, parameters and prices. Retired models redirect to their replacement, and new model IDs work before the catalog knows them. You can override or extend the catalog with a hot-reloaded YAML file.

  • Cost-aware. Every result reports its estimated cost, and estimate_cost compares options before you spend. Spend is recorded in a ledger, capped by session, daily and monthly budgets, and calls above a threshold need explicit approval.

  • Agent-friendly. Each tool matches a workflow, and errors come back as [kind] message + Hint. Image results include inline previews, and outputs can be chained by URI. Video runs as async jobs with long-polling and progress notifications.

  • Skills included. Six agent skills cover each medium, multi-asset productions and upscaling past 4K. The upscale skill re-renders a photo tile by tile and stitches the tiles into an 8K image.

  • Robust. Backend and credentials are detected the way the Google SDKs do it. Vertex locations are chosen per model, retries and timeouts are built in, files are written atomically with provenance, and HTTP mode ships with security defaults.

Upgrading from v0? The tools changed. See the migration table. The review also covers what was broken, why, and the design of v1.

Quick start

  1. Get credentials. Either:

    • an API key from Google AI Studio (GEMINI_API_KEY), or

    • a Google Cloud project with Vertex AI enabled (GOOGLE_CLOUD_PROJECT plus gcloud auth application-default login).

  2. Install the binary. On macOS or Linux:

    mkdir -p ~/.local/bin   # must be on your PATH
    os=$(uname -s | tr '[:upper:]' '[:lower:]'); arch=$(uname -m | sed 's/x86_64/x64/; s/aarch64/arm64/')
    curl -fsSL "https://github.com/mordor-forge/gemini-media-mcp/releases/latest/download/$os.$arch.gemini-media-mcp.tar.gz" \
      | tar -xz -C ~/.local/bin gemini-media-mcp
    gemini-media-mcp version

    On Windows, download the windows zip from the latest release and put gemini-media-mcp.exe on your PATH. With Go 1.26+: go install github.com/mordor-forge/gemini-media-mcp/cmd/gemini-media-mcp@latest.

    The Gemini CLI extension, the Claude Desktop bundle and the Docker image include the binary, so they skip this step.

  3. Add the server to your agent. Every config below runs gemini-media-mcp from your PATH.

    Claude Code (plugin: server plus skills):

    /plugin marketplace add mordor-forge/gemini-media-mcp
    /plugin install gemini-media@mordor-forge

    or just the server: claude mcp add gemini-media -e GEMINI_API_KEY=... -- gemini-media-mcp

    Codex (~/.codex/config.toml):

    [mcp_servers.gemini-media]
    command = "gemini-media-mcp"
    env_vars = ["GEMINI_API_KEY", "GOOGLE_API_KEY", "GOOGLE_CLOUD_PROJECT", "GOOGLE_CLOUD_LOCATION"]
    tool_timeout_sec = 300   # 4K images and video polls can exceed the 60 s default

    Gemini CLI (paid API keys, Vertex AI and Gemini Code Assist only, since June 2026): gemini extensions install https://github.com/mordor-forge/gemini-media-mcp

    Antigravity CLI: add the server to ~/.gemini/config/mcp_config.json, as shown in the install snippets.

    Claude Desktop: download gemini-media-mcp-<version>.mcpb from the latest release and open it.

    VS Code / Copilot: code --add-mcp '{"name":"gemini-media","command":"gemini-media-mcp"}'

    Cursor, Windsurf and other mcpServers-style clients (Zed, OpenCode and Goose use their own formats, see below):

    { "mcpServers": { "gemini-media": { "command": "gemini-media-mcp", "env": { "GEMINI_API_KEY": "..." } } } }

    If a desktop app reports that gemini-media-mcp was not found, it doesn't see your shell's PATH: use the full path from command -v gemini-media-mcp. Every client, plus Docker and the skills installer, is covered in packaging/INSTALL-SNIPPETS.md.

  4. If your agent doesn't forward environment variables (plugins often don't), store the key once:

    echo "$GEMINI_API_KEY" | gemini-media-mcp configure --api-key-stdin
    gemini-media-mcp doctor   # checks credentials, backend and model availability

To run it in Docker instead: docker run -i --rm --user "$(id -u):$(id -g)" -e GEMINI_API_KEY -v "$PWD/media:/output" -v gemini-media-state:/state ghcr.io/mordor-forge/gemini-media-mcp (--user makes the generated files yours on Linux; the named /state volume keeps spend accounting and video jobs between runs).

Related MCP server: Gemini Media MCP

Tools

Tool

What it does

generate_image

Text-to-image with up to 14 reference images, 1K–4K, many aspect ratios, 1–4 variations, optional Google Search grounding

edit_image

Change an existing image (add/remove/restyle/relight/outpaint) while keeping the rest

tile_image

Step 1 of an upscale to any target size (1K–16K): plan the cheapest crops that cover it, shaped to the edit model's aspect ratios (one tile up to about 4K, a grid beyond, or regions such as faces). Free and local

stitch_tiles

Align the edited tiles with the image, match their color, blend the overlaps and save one large PNG (8K by default). Free and local

generate_video

Clip with native audio from text, a first frame, first+last frames, or reference images: Veo (4–8 s, up to 3 references) or Gemini Omni Flash (omni: 3–10 s, 360p drafts to 4K, up to 10 references). Returns a jobId

get_video

Wait for a job (long-poll, default 45 s); downloads the video when done. Safe to repeat

extend_video

Continue a finished clip: Omni adds up to 10 s (40 s total), Veo about 7 s (up to 148 s total)

edit_video

Change a finished clip or a video file of up to 10 s with an instruction (Gemini Omni)

generate_speech

Text-to-speech (WAV): one voice, or a two-speaker dialogue, with per-line style control and 30 voices

generate_music

30-second clips or full songs with lyrics, structure tags, tempo, instrumental mode and image inspiration

list_models

Current models, aliases, status, prices; detail for supported parameters, live to check what your key can use

estimate_cost

Price a request before running it and compare models

get_usage

Estimated spend by period, model and tool; budgets remaining; running jobs

get_config

Active backend and why it was chosen, output directory, defaults, warnings

Every result includes the saved file's path, a gemini-media://files/<name> URI and its cost. You can pass the URI as an input to another tool. Clients that can't read the server's disk (for example over HTTP) can fetch the file with resources/read, for files up to 64 MB (larger upscales stay on the server's disk).

Skills

The skills/ directory contains Agent Skills that teach agents the full workflow for each media type: intent, prompt craft, model choice, cost checks, review and iteration. They cover interactive use as well as unattended runs.

Skill

For

gemini-image

Images: generation, editing, multi-reference composition, text rendering

gemini-video

Video: text/image-to-video, frame interpolation, reference ingredients, Omni editing, extension, async jobs

gemini-speech

Voiceovers, narration, two-speaker dialogue, voice and style selection

gemini-music

Clips and full songs with structure, lyrics and tempo

gemini-media-production

Multi-asset projects (storyboard → keyframes → video → voiceover → music → ffmpeg assembly) with a budget plan

gemini-upscale

Upscaling photos to 1K, 2K, 4K or 8K: one tile up to 4K, a grid of 4K tiles stitched together beyond that, with an optional fix pass for defects such as mismatched eyes. About $0.04 at 1K to $0.50–1.20 at 8K. It invents plausible detail rather than recovering it, so it is not for forensic or archival use

Plugin installs (Claude Code, Codex, Gemini CLI, VS Code) include the skills. To install them in any Agent Skills–compatible agent, run npx skills add mordor-forge/gemini-media-mcp, or copy the folders into .agents/skills/ or ~/.claude/skills/.

Models

Use an alias or a full model ID. Run gemini-media-mcp models for the built-in catalog with prices, or call list_models, which also applies your override file and, with live: true, checks what your key can use.

Media

Aliases (default first)

Image

nb2 (Nano Banana 2.1, default), pro (Nano Banana Pro: highest fidelity), nb2-lite (cheapest inputs)

Video

omni (Gemini Omni Flash, default on the Gemini API: prompt adherence, editing, extension to 40 s; Gemini API only), lite (cheapest Veo, default on Vertex AI), fast (Veo 4K, references, extension), standard (highest Veo quality)

Speech

tts (Gemini 3.8 Flash TTS), tts-lite, tts-2.5, tts-pro

Music

clip (30 s), full (Lyria 3.5 songs)

Veo on the Gemini API. Google is shutting down the Veo 3.1 previews (and the gemini-omni-flash-preview model) on the Gemini API on 2026-10-22. Until then lite, fast and standard still work there with a deprecation warning; after it the server uses omni instead and says so. Veo 3.1 stays available on Vertex AI, now called Gemini Enterprise Agent Platform (veo-3.1-*-generate-001): to keep using it, run the server against a Google Cloud project: GOOGLE_CLOUD_PROJECT plus gcloud auth application-default login, and GEMINI_MEDIA_BACKEND=vertex if an API key is also set (see Configuration).

Updating or adding a model without waiting for a release. Create a YAML file and point GEMINI_MEDIA_CATALOG at it. The server merges it with the built-in catalog by id and reloads it automatically:

defaults:
  video: fast
models:
  - id: veo-3.1-fast-generate-preview
    pricing: { perSecond: { 720p: 0.10, 1080p: 0.12, 4k: 0.30 } }
  - id: veo-4.0-generate-preview        # a brand-new model
    aliases: [veo4]
    pricing: { perSecond: { 720p: 0.50 } }

See internal/catalog/models.yaml for the full schema.

Configuration

Settings are layered: built-in defaults < config file < environment < flags. The config file lives at ~/.config/gemini-media-mcp/config.yaml on Linux, ~/Library/Application Support/gemini-media-mcp/config.yaml on macOS, %AppData%\gemini-media-mcp\config.yaml on Windows, or wherever GEMINI_MEDIA_CONFIG points. Unknown keys produce warnings instead of errors, and get_config shows where each setting came from.

Environment variable

Config key

Default

Purpose

GEMINI_API_KEY / GOOGLE_API_KEY / GEMINI_MEDIA_API_KEY

apiKey

–

Gemini API key (or Vertex express-mode key)

GEMINI_MEDIA_PROJECT / GOOGLE_CLOUD_PROJECT

project

–

Vertex AI project (Application Default Credentials)

GEMINI_MEDIA_LOCATION / GOOGLE_CLOUD_LOCATION / GOOGLE_CLOUD_REGION

location

per model

Vertex region; models not offered there use their catalog location

GOOGLE_GENAI_USE_VERTEXAI / GOOGLE_GENAI_USE_ENTERPRISE

–

–

true selects Vertex AI, false the Gemini API (same semantics as the Google SDKs)

GEMINI_MEDIA_BACKEND

backend

auto

auto, gemini-api or vertex

MEDIA_OUTPUT_DIR / GEMINI_MEDIA_OUTPUT_DIR

outputDir

~/generated_media

Where media is saved

GEMINI_MEDIA_STATE_DIR

stateDir

$XDG_STATE_HOME/gemini-media-mcp, else ~/.local/state/gemini-media-mcp (Linux) or the config directory

Spend ledger and video jobs

GEMINI_MEDIA_BUDGET_SESSION_USD / _DAILY_USD / _MONTHLY_USD

budget.*Usd

none

Spend caps (estimated)

GEMINI_MEDIA_CONFIRM_ABOVE_USD

budget.confirmAboveUsd

none

Calls above this need approvedCostUsd

GEMINI_MEDIA_IMAGE_MODEL / _VIDEO_MODEL / _SPEECH_MODEL / _MUSIC_MODEL / GEMINI_MEDIA_VOICE

defaults.*

catalog

Default models and voice (a model set here is the default on both backends; the server refuses to start if the backend in use does not offer it)

GEMINI_MEDIA_CATALOG

catalogFile

–

Catalog override file (hot-reloaded)

GEMINI_MEDIA_INPUT_DIRS

inputDirs

–

Extra directories inputs may be read from (HTTP mode)

GEMINI_MEDIA_ALLOW_ANY_INPUT_PATH

allowAnyInputPath

true on stdio, false on HTTP

Read input files from anywhere on disk

GEMINI_MEDIA_INLINE_PREVIEWS / GEMINI_MEDIA_PREVIEW_MAX_PIXELS

inlinePreviews / previewMaxPixels

true / 768

Attach a downscaled preview to image results, and its longest side

GEMINI_MEDIA_REQUEST_TIMEOUT_SECONDS

requestTimeoutSeconds

600

Timeout of each Google API request

GEMINI_MEDIA_MAX_VIDEO_WAIT_SECONDS

maxVideoWaitSeconds

600

Upper limit for waitSeconds on video tools

GEMINI_MEDIA_RETRY_ATTEMPTS

retry.attempts

4

Attempts for rate-limited (429) and unavailable (503) responses

GEMINI_MEDIA_LOG_LEVEL

logLevel

info

debug, info, warn or error (logs go to stderr)

GEMINI_MEDIA_TRANSPORT

transport

stdio

stdio or http

GEMINI_MEDIA_HTTP_ADDR / GEMINI_MEDIA_HTTP_TOKEN

http.addr / http.authToken

127.0.0.1:8765 / –

HTTP listen address and bearer token

–

http.path

/mcp

HTTP endpoint path

GEMINI_MEDIA_HTTP_ALLOWED_ORIGINS

http.allowedOrigins

–

Extra trusted browser origins, comma-separated

GEMINI_MEDIA_HTTP_STATEFUL

http.stateful

false

Keep per-client sessions (only for legacy 2025-11-25 clients that need them)

How the backend is chosen:

  1. An explicit backend setting wins.

  2. Otherwise the SDK switches GOOGLE_GENAI_USE_ENTERPRISE and GOOGLE_GENAI_USE_VERTEXAI decide.

  3. Otherwise an API key selects the Gemini API, even if GOOGLE_CLOUD_PROJECT is set in your shell for other tools.

  4. Otherwise a project selects Vertex AI.

On Vertex, an API key without a project uses express mode, which does not support video.

Spend and budgets

Google doesn't return costs, so the server computes them from its price table and the token usage the API reports. Every call records an estimate before it runs and the reconciled cost afterwards. Failed and safety-blocked generations count as $0. A response that used tokens but returned no media (for example MAX_TOKENS) is charged for those tokens.

  • Results include cost {estimatedUsd, usd, basis}. get_usage and gemini-media-mcp usage summarize spend. The ledger is a plain JSONL file in the state directory.

  • Budgets are enforced before each call, across concurrent calls and across several server processes sharing a state directory (in-flight calls hold their estimate under a file lock).

  • With GEMINI_MEDIA_CONFIRM_ABOVE_USD=1, an expensive call (for example a $3.20 Veo clip) comes back as a [confirmation] error. The agent asks you, then retries with approvedCostUsd.

  • These figures are estimates. For a hard stop, also set a spend cap in AI Studio or a budget in Cloud Billing.

HTTP mode

GEMINI_API_KEY=... gemini-media-mcp serve --transport http                 # http://127.0.0.1:8765/mcp
GEMINI_MEDIA_HTTP_TOKEN=secret gemini-media-mcp serve --transport http --http-addr 0.0.0.0:8765
claude mcp add --transport http gemini-media http://127.0.0.1:8765/mcp --header "Authorization: Bearer secret"
  • HTTP mode is stateless Streamable HTTP, which MCP 2026-07-28 requires; older clients still work.

  • The server protects against DNS rebinding and cross-origin requests.

  • It refuses to listen on a non-loopback address without a token.

  • It only reads input files from the output directory or GEMINI_MEDIA_INPUT_DIRS (unless GEMINI_MEDIA_ALLOW_ANY_INPUT_PATH=true).

  • GET /healthz reports status.

Development

Paid live E2E tests are run locally with your own API key. CI runs the free checks and compiles/vets the E2E tests, but never executes live generation, including after merges to main or on manual workflow runs.

go build ./...
go test -race ./...
golangci-lint run
python3 scripts/validate-skills.py skills
GEMINI_MEDIA_E2E=1 GEMINI_API_KEY=... go test -tags=e2e ./internal/media/ -run E2E -v -timeout 30m   # live, costs cents
# add GEMINI_MEDIA_E2E_VIDEO=1 for the video test (~$0.20), GEMINI_MEDIA_E2E_OMNI=1 for the Omni clip + edit (~$0.30),
# GEMINI_MEDIA_E2E_UPSCALE=1 for a small tiled upscale (~$0.20),
# GEMINI_MEDIA_E2E_OUTPUT_DIR=./e2e-out to keep the files

License

Apache-2.0

Available Tools

14 tools
edit_imageEdit imageA

Change an existing image with an instruction (add/remove/replace elements, restyle, relight, change aspect ratio, fix text) while keeping everything else. Accepts extra reference images to insert or match. Say what must stay unchanged. Saves a new file; the original is kept.

ParametersJSON Schema
NameRequiredDescriptionDefault
imageYesThe image to edit: file path, gemini-media:// URI from an earlier result, or data: URI.
modelNoModel ID or alias. Defaults to the model that created the source image, else nb2.
promptYesThe change to make, stated specifically, plus what must stay the same (e.g. 'Replace the sky with a sunset; keep the people, framing and lighting on faces unchanged').
imageSizeNoOutput size: 1K, 2K or 4K (512 only on the deprecated gemini-3.1-flash-image).
outputNameNoOptional base file name for the saved file. Defaults to the source name plus -edit.
aspectRatioNoChange the aspect ratio (outpainting). Omit to keep the source ratio.
approvedCostUsdNoOnly needed above the confirmation threshold: the cost in USD the user approved.
referenceImagesNoOptional extra images to pull elements or style from (e.g. 'put the logo from image 2 on the mug').

Output Schema

ParametersJSON Schema
NameRequiredDescription
costYes
textNoCommentary the model returned alongside the image(s)
filesYes
modelYes
warningsNo
groundingNoGoogle Search queries the model ran and the pages it used (googleSearch only)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false; the description corroborates and enriches this by stating "Saves a new file; the original is kept", which is exactly the consequence an agent needs for a non-destructive mutation. It adds nothing about cost approvals, model selection, or rate limits, so it is not fully rich.

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?

Four short sentences, front-loaded with the core purpose and scoping constraint. "Say what must stay unchanged" slightly overlaps the prompt field's own example in the schema, a minor redundancy, but every sentence otherwise carries weight.

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?

With an output schema present, return values need no explanation, and the schema documents all 8 parameters at full coverage. The description completes the picture on mutation semantics, preservation of the original, and reference-image behavior; it omits any note on the cost-confirmation threshold, which the schema covers indirectly.

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?

Schema coverage is 100%, so the baseline is 3; the description still adds meaning beyond the field docs by explaining what referenceImages are for ("pull elements or style from" / "insert or match") and by prescribing the prompt structure (change + what must stay the same).

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?

States a specific verb and resource ("Change an existing image") and enumerates the concrete edit classes it supports (add/remove/replace, restyle, relight, aspect ratio, text fixes). The phrase "existing image" cleanly separates it from the sibling generate_image, which creates rather than modifies.

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?

Gives clear context for use (modify an existing image while keeping everything else) and practical guidance ("Say what must stay unchanged", extra reference images for insert/match). It does not explicitly name when not to use it or point to an alternative sibling, so it falls short of the 5 bar.

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

edit_videoEdit videoA

Change an existing clip with an instruction (add, remove or replace objects, restyle, relight, change the background) with Gemini Omni Flash, keeping everything else. Pass the jobId of a finished clip (Omni clips are edited in conversation) or a video file of at most 10 s. Asynchronous like generate_video; about $0.10 per second of video at 720p.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdNoA completed video job to edit. Omni clips are edited in conversation (Google keeps the context); other clips are sent as their saved file. Pass jobId or video.
modelNoModel ID or alias; default omni (the only model that edits videos).
videoNoOr a video file to edit: file path, gemini-media:// URI or data: URI. At most 10 seconds and 20 MB.
promptYesThe change, stated simply, ending with 'Keep everything else the same.' (e.g. 'Make the phone invisible. Keep everything else the same.')
outputNameNoOptional base file name for the saved video. Defaults to the source name plus -edit.
resolutionNo360p, 720p (default), 1080p or 4k (1080p and 4k are upscaled).
waitSecondsNoBlock up to this many seconds for the result (default 0 = return a job handle immediately). Keep under your client's tool timeout.
approvedCostUsdNoOnly needed above the confirmation threshold: the cost in USD the user approved.
referenceImagesNoOptional images to bring into the clip; refer to them as <IMAGE_REF_0>, <IMAGE_REF_1>... in the prompt.

Output Schema

ParametersJSON Schema
NameRequiredDescription
costYes
nextNoSuggested next step
errorNo
filesNo
jobIdYesOpaque handle; pass it to get_video, extend_video or edit_video
modelYes
stateYesworking, completed, failed or filtered
warningsNo
elapsedSecondsYes
remoteExpiresAtNoWhen Google deletes the server-side copy; extend before this time

TDQS

A4.4/5.0
Behavior5/5

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

Adds rich context beyond annotations: asynchronous behavior like generate_video, cost of ~$0.10/second at 720p, the <=10s input limit, and the conversational editing model for Omni clips. This goes well beyond the readOnly/destructive hints.

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 dense sentences, front-loaded with the core action and editing capabilities, followed by input constraints and async/cost details. Efficient, though the parenthetical enumeration and cost clause make it slightly heavy.

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

Completeness5/5

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

For a 9-parameter async mutation tool with full schema and an output schema present, the description covers the essential agent-facing facts: purpose, input source, duration limit, async nature, and cost. Nothing material is missing.

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 parameters are already fully documented in the schema. The description adds some value by mentioning jobId vs video and the 10s cap, but largely repeats schema content; baseline 3 is appropriate.

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?

States a specific verb (edit) and resource (existing clip), enumerates the kinds of edits supported, and names the model and siblings it relates to (generate_video). An agent can distinguish it from generate_video, extend_video, and edit_image without opening schemas.

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?

Explains when to use: to change an existing clip while keeping everything else, and clarifies the two input sources (jobId of a finished clip or a video file). It lacks explicit when-not-to-use guidance (e.g. when to prefer extend_video or edit_image), keeping it below 5.

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

estimate_costEstimate costA
Read-onlyIdempotent

Estimate the cost of an image, video, speech or music request before running it, optionally comparing all models; also reports remaining budget and whether approval is needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoSpeech: the text to be spoken (length drives cost)
countNoNumber of images/clips/songs (default 1)
modelNoModel ID or alias (default model when omitted)
compareNoAlso estimate the same request on every other active model of this media type
imageSizeNoImages: 512, 1K, 2K or 4K
mediaTypeYesimage, video, speech or music
resolutionNoVideo: 720p, 1080p or 4k (Omni also 360p)
inputImagesNoImages: number of reference/source images
generateAudioNoVideo on Vertex AI: false for the cheaper silent rate
durationSecondsNoVideo: clip length (default 8)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
modelYes
estimateYes
warningsNoLifecycle notices (deprecation, shutdown, replacement) and budget problems
alternativesNo
needsApprovalYesTrue when the call would exceed the confirmation threshold and needs approvedCostUsd
budgetRemainingNo
wouldExceedBudgetNoTrue when a budget would refuse this call right now (see warnings)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish readOnly/idempotent/no open-world, so the safety profile is covered. The description adds real behavioral context beyond that: the call compares models only when requested and additionally surfaces remaining budget and whether approval is needed, which is not derivable from the annotation block.

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?

A single front-loaded sentence leading with the core purpose, then two appended clauses for the optional compare behavior and extra outputs. Every clause carries information, though the semicolon-chained tail is slightly dense.

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?

With a 100% covered schema, an output schema that documents return values, and annotations covering the safety profile, the description supplies the missing intent layer (multi-media, pre-flight, optional comparison). It is adequate for correct invocation, though it says nothing about output units or error conditions, which is acceptable given the output schema.

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% and every parameter (count, model, compare, imageSize, resolution, durationSeconds, etc.) is documented in the schema itself. The description's remark about 'optionally comparing all models' duplicates the existing compare parameter description, so it adds little beyond the structured fields — baseline 3.

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?

States a specific verb (estimate) and resource (cost of image/video/speech/music requests) and frames it as a pre-flight step ('before running it'), which implicitly separates it from the generate_*/edit_* siblings. It also names the secondary outputs (remaining budget, approval need), so an agent knows exactly what this tool returns.

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?

'before running it' gives a clear usage context: call this prior to a generation request to preview spend. It does not name explicit alternatives or when-not-to-use conditions (e.g. relation to get_usage or get_config), so it stops short of full routing guidance.

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

extend_videoExtend videoA

Continue a completed clip from its end: omni adds up to 10 s (40 s total, keeping characters and audio coherent); Veo fast/standard add about 7 s (720p, up to 148 s, within 2 days). Asynchronous like generate_video.

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNoVertex AI only.
jobIdYesJob handle of a completed generate_video or extend_video call (operation names from older versions also work).
promptYesWhat happens next. Veo adds about 7 seconds (720p) from the last second; omni adds up to 10 seconds using the last 10 seconds as context.
outputNameNo
waitSecondsNoBlock up to this many seconds for the result (default 0).
negativePromptNo
approvedCostUsdNoOnly needed above the confirmation threshold.

Output Schema

ParametersJSON Schema
NameRequiredDescription
costYes
nextNoSuggested next step
errorNo
filesNo
jobIdYesOpaque handle; pass it to get_video, extend_video or edit_video
modelYes
stateYesworking, completed, failed or filtered
warningsNo
elapsedSecondsYes
remoteExpiresAtNoWhen Google deletes the server-side copy; extend before this time

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true). The description adds real value beyond them: per-model duration caps, 720p/coherence properties, and that the call is asynchronous like generate_video. It omits cost/threshold behavior, which limits it below a 5.

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?

Front-loaded with the core action, then dense but earned model-specific detail. The second sentence on async behavior is a compact, useful pointer to generate_video. No filler, though the parenthetical packing is heavy for a single sentence.

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?

An output schema exists, so return values need not be explained. Given the multi-model complexity, the description covers duration, coherence, resolution, and async behavior well, though it omits cost-confirmation context that the approvedCostUsd parameter hints at.

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 71%, so the schema documents most parameters (jobId, prompt, seed, waitSeconds, approvedCostUsd). The description's model context (10 s omni vs 7 s Veo, last-second vs last-10-seconds context) loosely informs how prompt is interpreted, but it does not clarify the two undocumented parameters (outputName, negativePrompt). Baseline 3 is appropriate.

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?

The description names a specific verb and resource ("Continue a completed clip from its end") and enumerates model-specific extension limits, so the purpose is immediately clear. However, it never explicitly distinguishes itself from the sibling edit_video, which is the operation an agent is most likely to confuse it with.

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 is implied by "completed clip," meaning the input must already exist, and the async note references generate_video as a parallel. But there is no explicit when-to-use vs edit_video/stitch guidance or any when-not condition, leaving routing to inference.

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

generate_imageGenerate imageA

Create images from a text prompt, optionally guided by up to 14 reference images (subjects, products, style). Default model nb2 (Nano Banana 2.1, $0.04 per 1K image); pro for the densest scenes and final renders ($0.15); nb2-lite for bulk drafts. Returns saved files with URIs you can pass to edit_image, generate_video (image) or other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoNumber of variations to generate in parallel (1-4, default 1). Each is billed.
modelNoModel ID or alias. nb2 (default: Nano Banana 2.1, fast and cheap), pro (Nano Banana Pro, highest fidelity for dense scenes), nb2-lite (cheapest inputs). See list_models.
promptYesWhat to create. Describe subject, setting, composition, lighting and style in full sentences. Put any exact text to render in quotes.
imageSizeNoOutput size: 1K (default), 2K or 4K. Larger costs more. 512 only on the deprecated gemini-3.1-flash-image.
outputNameNoOptional base file name (without extension) for the saved file(s).
aspectRatioNoe.g. 1:1, 3:2, 2:3, 4:3, 3:4, 4:5, 16:9, 9:16, 21:9 (nb2 also 1:4, 4:1, 1:8, 8:1). Defaults to 1:1 when there are no reference images; with them the model usually follows the first image's ratio.
googleSearchNoGround the image in Google Search results (current events, real places, data for infographics).
approvedCostUsdNoOnly needed when a call exceeds the configured confirmation threshold: the cost in USD the user approved.
referenceImagesNoOptional images to guide the result (subjects, products, characters, style): file paths, gemini-media:// URIs from earlier results, or data: URIs. Up to 14 for nb2/pro.

Output Schema

ParametersJSON Schema
NameRequiredDescription
costYes
textNoCommentary the model returned alongside the image(s)
filesYes
modelYes
warningsNo
groundingNoGoogle Search queries the model ran and the pages it used (googleSearch only)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare non-read-only, open-world, non-idempotent behavior, and the description adds material context beyond that: per-1K pricing for each model (~$0.04 / ~$0.15), the fact that every variation in 'count' is separately billed, and the cost-confirmation threshold that triggers approvedCostUsd. That is genuine cost/behavioral disclosure. It does not cover failure modes or quota limits.

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, no filler, with the core capability front-loaded before the model/cost guidance and the downstream-chaining note. It is dense rather than padded, though the final sentence mixes return-value and routing information that the output schema partly covers.

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

Completeness5/5

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

For a 9-parameter generative tool with a full output schema and non-trivial cost implications, the description covers capability, cost trade-offs across models, cost-confirmation behavior, and interoperable output URIs. Nothing an agent needs to invoke it correctly is missing, and return-format detail is properly delegated to the 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?

Schema coverage is 100%, so the baseline is 3. The description still adds meaning the schema lacks: the reference-image limit ('up to 14'), the cost ordering of the three model aliases, and the role of the returned URIs relative to edit_image/generate_video. Payments and billing consequences of 'count' are recast in cost terms rather than just a range.

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?

States a specific verb+resource ('Create images from a text prompt') and immediately scopes it with the reference-image capability. It clearly distinguishes itself from edit_image and generate_video, which it names as downstream consumers of the returned URIs, so the agent can separate generation from editing without opening a schema.

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?

Gives concrete model-selection guidance keyed to use case: nb2 as default, pro for 'densest scenes and final renders', nb2-lite for 'bulk drafts'. It also routes the agent to follow-on tools after generation. It stops short of stating when to prefer this tool over edit_image for an iterative change, so it is clear but not fully exclusive.

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

generate_musicGenerate musicA

Compose music with Lyria: 30-second clips (clip, $0.04) or full songs of a few minutes with vocals and lyrics (full, $0.08). Control genre, mood, instruments, tempo and structure in the prompt; returns lyrics/structure text when available.

ParametersJSON Schema
NameRequiredDescriptionDefault
bpmNoOptional tempo hint in beats per minute.
modelNoclip (default: 30-second MP3, cheapest) or full (complete song up to about 3 minutes, vocals, WAV option). See list_models.
formatNomp3 (default) or wav (full model only).
imagesNoOptional images (up to 10) whose mood or scene should inspire the music.
lyricsNoOptional lyrics with section tags; they are sung in the language they are written in.
promptYesDescribe the music: genre, mood, instruments, tempo, key, production style and song structure. Use [Intro]/[Verse]/[Chorus]/[Bridge]/[Outro] tags or [0:00-0:15] timestamps to control sections.
outputNameNoOptional base file name.
instrumentalNoAsk for no vocals.
approvedCostUsdNoOnly needed above the confirmation threshold.
durationSecondsNoOptional target length hint for full songs (clip is always 30s).

Output Schema

ParametersJSON Schema
NameRequiredDescription
costYes
fileYes
modelYes
lyricsNoLyrics or song structure returned by the model
warningsNo
durationSecondsNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare openWorld/non-idempotent/non-destructive; the description adds the genuinely useful behavioral facts: this is a paid operation ($0.04 vs $0.08), the two models differ in duration and vocal capability, and it returns lyrics/structure text when available. It still does not explain the cost-confirmation threshold tied to approvedCostUsd.

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?

Two compact sentences, front-loaded with the mode/cost tradeoff and followed by control-surface and return information. Every clause carries distinct information with no filler.

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?

For a 10-parameter generation tool with an output schema present, the description covers the key decision axes (model, format, cost, prompt controls) without needing to restate return values. Only the approval-threshold mechanics for approvedCostUsd remain unexplained, a minor gap given the schema's own hint.

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 every parameter is already documented (bpm, model, format, images, lyrics, prompt, etc.). The description mostly echoes the prompt's controllable aspects (genre, mood, instruments, tempo, structure) rather than adding syntax or constraints beyond the schema, so baseline 3 applies.

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?

States a specific verb and resource ('Compose music with Lyria') and immediately enumerates the two output modes with their lengths and prices. This clearly separates it from siblings like generate_speech and generate_video without needing to open any schema.

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?

Gives concrete selection context: clip is the cheap 30-second option, full yields minutes-long songs with vocals/lyrics, and format=wav applies only to full. It does not explicitly route the agent away from siblings (e.g., when to use generate_speech instead), so it stops short of full when/when-not guidance.

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

generate_speechGenerate speechA

Turn text into natural speech (WAV) with one voice, or a dialogue between two speakers. Control delivery with style. About $0.01-0.02 per minute of audio. For podcasts, voiceovers, narration and dialogue.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoThe exact words to speak (single speaker). Newer models read it verbatim, so put delivery directions in style, not here. Inline tags like <sigh> or <short pause> are allowed.
modelNoModel ID or alias: tts (default, Gemini 3.8 Flash TTS), tts-lite (cheaper). See list_models.
styleNoHow to deliver the lines, e.g. 'warm and enthusiastic', 'whispered urgently', 'slow, calm narrator'.
voiceNoVoice for single-speaker text, e.g. Kore (firm), Puck (upbeat), Charon (informative), Aoede (breezy, default), Zephyr (bright). list_models shows all 30.
formatNowav (default) or pcm (raw 16-bit little-endian).
dialogueNoAlternative to text: a conversation between up to 2 named speakers, one entry per line.
speakersNoVoice per dialogue speaker; unlisted speakers get distinct defaults.
outputNameNoOptional base file name.
languageCodeNoOptional BCP-47 code (e.g. en-US, it-IT). Usually auto-detected from the text.
approvedCostUsdNoOnly needed above the confirmation threshold.

Output Schema

ParametersJSON Schema
NameRequiredDescription
costYes
fileYes
modelYes
voicesYes
warningsNo
durationSecondsNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly=false, destructive=false, openWorld=true, non-idempotent), so the description's job is to add beyond that — and it does, disclosing cost (~$0.01-0.02/minute) and the default output format, which an agent needs for budgeting. It does not say whether generation is synchronous or job-based, which is the main remaining behavioral gap.

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?

Four short sentences, front-loaded with the core capability, then delivery control, then cost, then use cases. Nothing is redundant and no sentence could be dropped without losing decision-relevant information.

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?

For a 10-parameter, zero-required tool with full schema coverage and an output schema, the description supplies the framing an agent needs: two modes, style control, cost, and target use cases. It leaves the approval-threshold mechanics and sync/async behavior to the schema, a minor but real gap.

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 every parameter already documents itself with examples (voice names, model aliases, BCP-47 codes, inline tags). The description only restates the text-vs-dialogue and style concepts at a high level, adding little beyond the schema — the correct baseline of 3.

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?

States a specific verb and resource ('Turn text into natural speech (WAV)') and immediately disambiguates the two operating modes: single voice vs. two-speaker dialogue. That distinction cleanly separates it from siblings like generate_music and generate_video without opening any schema.

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?

Gives concrete usage contexts ('podcasts, voiceovers, narration and dialogue'), which tells the agent when this is the right tool. It stops short of naming alternatives or exclusions (e.g., when to prefer generate_music for sung/ambient audio), so it is clear context without explicit routing.

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

generate_videoGenerate videoA

Start a video clip with native audio from a text prompt, optionally from a first frame, first+last frames, or reference images. Default omni (Gemini Omni Flash: 3-10s, cheap 360p drafts up to 4K, up to 10 references). On Vertex AI the default is Veo lite; fast/standard add Veo 4K and ingredients. Veo is leaving the Gemini API (list_models has the date). estimate_cost prices any option. Asynchronous: returns a jobId; then call get_video.

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNoSeed for more repeatable results (Vertex AI only; ignored on the Gemini API).
imageNoOptional first frame (image-to-video): file path, gemini-media:// URI or data: URI.
modelNoModel ID or alias: omni (default on the Gemini API: Gemini Omni Flash, best prompt adherence, editable and extendable to 40 s), lite (cheapest Veo; the default on Vertex AI), fast (Veo 4K, ingredients) or standard (highest Veo quality). Veo is leaving the Gemini API: list_models shows its shutdown date. See list_models.
promptYesWhat happens in the clip: subject and action, camera movement, setting, lighting, style, and sound (dialogue in quotes, sound effects, ambience, music).
lastFrameNoOptional last frame; requires image. Veo interpolates between the two.
outputNameNoOptional base file name for the saved video.
resolutionNo720p (default), 1080p or 4k (not lite); omni also 360p for fast drafts. Veo 1080p and 4k require 8-second clips.
aspectRatioNo16:9 (default) or 9:16
waitSecondsNoBlock up to this many seconds for the result (default 0 = return a job handle immediately). Keep under your client's tool timeout.
generateAudioNoVertex AI only: set false for silent video at a lower price. The Gemini API always generates audio.
negativePromptNoWhat to avoid, as plain nouns (e.g. 'text overlays, blur'). For omni it is appended to the prompt.
approvedCostUsdNoOnly needed above the confirmation threshold: the cost in USD the user approved.
durationSecondsNoClip length: Veo 4, 6 or 8 seconds; omni 3-10 seconds (default 8).
referenceImagesNoImages of characters, objects, products or styles to keep consistent: Veo fast/standard up to 3 (forces 8s, not with image/lastFrame); omni up to 10 including frames (name them <IMAGE_REF_0>... in the prompt).
personGenerationNoallow_all, allow_adult or dont_allow. The Gemini API requires allow_all for text-to-video and allow_adult for image-based modes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
costYes
nextNoSuggested next step
errorNo
filesNo
jobIdYesOpaque handle; pass it to get_video, extend_video or edit_video
modelYes
stateYesworking, completed, failed or filtered
warningsNo
elapsedSecondsYes
remoteExpiresAtNoWhen Google deletes the server-side copy; extend before this time

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare write/openWorld/not-idempotent; the description adds the genuinely load-bearing behaviors: the call is asynchronous and returns a jobId requiring a second call to get_video, and a cost-confirmation threshold gates execution (approvedCostUsd is 'only needed above the confirmation threshold'). It also discloses platform-dependent defaults and that audio is always generated on the Gemini API, which no annotation conveys.

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?

Front-loads what the tool does and its input modes, then layers model, cost, and async details in decreasing priority with zero filler sentences. It is dense and model-variant heavy in a single block, which slightly taxes scanning, but every sentence carries actionable information.

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

Completeness5/5

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

For a 15-parameter generative tool with an output schema present, the description covers what remains necessary: input modes, model selection and defaults per platform, pricing path, and the asynchronous follow-up call. Return values are covered by the output schema, so nothing critical is missing.

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?

Schema coverage is already 100%, so the baseline is 3, but the description adds decision-level meaning: platform-specific model defaults, the omni 3-10s range and reference-count differences, and the cost-approval gating on approvedCostUsd. Cross-parameter interactions (lastFrame requires image, referenceImages forces 8s) live mainly in the schema, so this is additive rather than complete.

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?

Opens with a precise verb+resource ('Start a video clip with native audio from a text prompt') and immediately enumerates the supported input modes (first frame, first+last frames, reference images). It names the sibling follow-up tool (get_video) and the advisory siblings (estimate_cost, list_models), so an agent can separate this from generate_image, edit_video, and extend_video without opening a schema.

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?

Gives clear routing context: default model differs by platform (omni on Gemini API, Veo lite on Vertex), estimate_cost should be used to price options, and list_models carries Veo's shutdown date. It also states the async workflow (call get_video after jobId). It stops short of explicit when-not-to-use guidance versus extend_video or edit_video, so it is strong but not exhaustive.

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

get_configGet configurationA
Read-onlyIdempotent

Show the active backend and how it was chosen, output directory, default models, budgets, input-file policy and configuration warnings. Use it to troubleshoot credentials or missing files.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
budgetYes
backendYes
projectNo
versionYes
authModeYes
defaultsYes
httpAddrNoAddress the HTTP transport listens on
locationNo
stateDirYes
warningsNo
outputDirYes
transportYes
configFileNo
catalogFileNo
inputPolicyYes
backendReasonYes
catalogVersionYes
inlinePreviewsYes
settingSourcesNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so safety is covered structurally. The description goes beyond them by describing the informational surface returned (backend selection rationale, policy, warnings) and the diagnostic intent (credentials/missing files), which is genuine extra context for an inspection tool.

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?

Two sentences, zero filler. The content enumeration comes first and the use case second, so the agent gets the what before the when.

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

Completeness5/5

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

With an output schema present, return-value detail is unnecessary in the description, and the zero-parameter, read-only profile needs no further caveats. Content and purpose are both covered, so nothing an agent needs in order to call it correctly is missing.

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 takes zero parameters and the schema is a closed empty object, so there is nothing parameter-wise for the description to explain. Baseline 4 applies for a no-parameter tool.

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?

States a specific verb ('Show') and resource (configuration) and then enumerates exactly what it reveals: active backend and its selection rationale, output directory, default models, budgets, input-file policy, and warnings. Nothing in the sibling list (media generation, usage, model listing) overlaps with this, so an agent can select it without ambiguity.

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?

Gives a concrete situation to reach for it: 'Use it to troubleshoot credentials or missing files.' That is a clear when-to-use signal, but no alternatives are named or excluded (e.g., versus get_usage or list_models for related diagnostics).

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

get_usageGet usage and spendA
Read-onlyIdempotent

Report estimated spend for this session, today, this month or all time, broken down by model and tool, with budget remaining, recent calls and running video jobs.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNosession (since this server started), today (default), month or all
recentNoHow many recent entries to include (default 10, max 100)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
extraNo
budgetYes
periodYes
summaryYes
activeJobsNo
ledgerPathYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description goes further by disclosing what the report contains, including non-obvious content like budget remaining and running video jobs, and the word 'estimated' signals that the figures are approximations rather than billed amounts.

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?

A single dense sentence that front-loads the purpose and then lists the report contents without filler. It is appropriately sized, though the trailing list of returned items is somewhat enumeration-heavy for a tool whose output schema already exists.

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?

With an output schema present, the return shape need not be spelled out, and the description still names the period options and the scope implied by 'this session'. What is missing is any note on data coverage or freshness limits (for example whether it reflects only this server's usage), which would matter for a spend-reporting tool.

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 both parameters are already fully documented, including the default and max for 'recent'. The description merely restates the period values that the schema enumerates, adding no new syntax, defaults, or interpretation guidance.

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?

States a specific verb and resource ('Report estimated spend') and enumerates the dimensions of the report (by model and tool, budget remaining, recent calls, running video jobs). It is clearly distinct from most siblings, but it never draws the boundary against the closest sibling, estimate_cost, which an agent could easily confuse with it.

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?

The description implies the tool's use for inspecting accumulated spend and activity, and the period parameter hints at granularity choices, but there is no explicit when-to-use guidance nor any statement of when another tool (estimate_cost for projections, get_config for settings) should be preferred.

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

get_videoGet video jobA
Idempotent

Check a video job and wait for it (default up to 45s). When the job completes, the video is downloaded and returned; calling again is safe and returns the same files.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesJob handle returned by generate_video, extend_video or edit_video.
waitSecondsNoBlock up to this many seconds for completion (default 45, 0 = check once). The video is downloaded automatically when ready.

Output Schema

ParametersJSON Schema
NameRequiredDescription
costYes
nextNoSuggested next step
errorNo
filesNo
jobIdYesOpaque handle; pass it to get_video, extend_video or edit_video
modelYes
stateYesworking, completed, failed or filtered
warningsNo
elapsedSecondsYes
remoteExpiresAtNoWhen Google deletes the server-side copy; extend before this time

TDQS

A3.8/5.0
Behavior4/5

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

Adds real behavior beyond annotations: the 45s default block, that the tool waits for completion, and that the video is downloaded and returned as a side effect. The idempotency claim aligns with idempotentHint=true, and the download explains readOnlyHint=false. No contradiction, though timeouts/failure behavior is left unstated.

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?

Two tight sentences with zero filler; the wait-on-completion behavior is front-loaded and the idempotency caveat follows immediately. Every clause carries information.

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?

With an output schema present, return values need not be described, yet the description still tells the agent the video is delivered on completion. Blocking duration and idempotency are covered; only timeout/error handling is absent, which is minor for this tool.

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 jobId's provenance and waitSeconds' default/0 semantics are fully documented in the schema itself. The description mentions the 45s default but adds no syntax or format detail beyond what the schema already gives. Baseline 3 applies.

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?

Specific verb+resource: 'Check a video job and wait for it', plus what happens on completion (video downloaded and returned). It is clearly distinct from the create/extend/edit siblings in that it only inspects an existing job. It stops short of naming a sibling it could be confused with, but no sibling is a close competitor.

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?

Implies polling usage by noting a default wait and stating 'calling again is safe', which tells the agent repeated calls are acceptable. It does not say when to prefer waiting vs. checking once, nor reference generate_video/extend_video/edit_video as the producers of the job handle in narrative form — that context lives only in the schema.

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

list_modelsList modelsA
Read-onlyIdempotent

List current models per media type with aliases, status (GA/preview/deprecated), prices and a short guide to when to use each. detail: true adds supported aspect ratios, sizes, durations and voices; live: true checks what your API key can actually call.

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNoAlso query the Gemini API for the models this key can use, flagging unavailable ones and media models missing from the catalog.
detailNoInclude full capabilities (aspect ratios, voices, rules).
mediaTypeNoFilter: image, video, speech or music.
includeInactiveNoAlso list retired models and their replacements.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modelsYes
backendYes
warningsNo
uncataloguedNoMedia models the API offers that the catalog does not know yet (usable by raw ID)
catalogVersionYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint and idempotentHint, so safety and statelessness are covered. The description adds that live:true performs an API-key-scoped availability check against the Gemini API, but that is already spelled out in the live parameter's schema text, so the added value beyond structured fields is modest.

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?

Two tightly packed sentences with zero filler, front-loading the primary purpose before the optional-flag behavior. Nothing is repeated and every clause carries distinct information.

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?

With an output schema present, return values need not be explained, and the description still summarizes them usefully for a zero-required-parameter catalog tool. The remaining gap is routing guidance against sibling discovery/utility tools (get_config, estimate_cost), which the description never addresses.

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?

Schema description coverage is 100%, so the baseline is 3, and the description goes slightly beyond by naming concrete capability fields returned under detail (aspect ratios, sizes, durations, voices) rather than the schema's generic 'full capabilities'. It still says nothing about mediaType values or includeInactive outside the schema.

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?

States a specific verb and resource ('List current models per media type') and enumerates the returned content (aliases, status GA/preview/deprecated, prices, usage guide). An agent can tell this is the catalog/discovery tool versus the generate_*/edit_* siblings, though the description never explicitly contrasts it with the closest neighbor, get_config.

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 is only implied: an agent infers it should call this to discover available models before generating. The phrases 'detail: true adds...' and 'live: true checks...' describe flag behavior, not when to prefer this tool over estimate_cost, get_config or get_usage, and there are no when-not conditions.

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

stitch_tilesStitch upscaled tilesA

Upscale step 3: align each edited tile from tile_image with the image, match its broad color, blend the overlaps and save one large PNG (default 8192 px long edge). Free and local. Reports tiles it rejected (their area keeps the prior pixels) and returns a preview plus 100% crops of the seams to inspect.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobYesThe job uri returned by tile_image.
tilesYesThe edited tiles. Tiles left out keep the underlying image.
detailsNoUp to 6 points to return as 100% crops for inspection. Default: where grid tiles meet, or each region's center.
featherNoBlend width as a fraction of each tile's shorter side (default 0.2, 0.05-0.4). Between neighboring tiles it is capped at half their overlap.
colorMatchNoMatch each tile's broad exposure and color to the image (default true). Fine texture is never transferred.
outputNameNoOptional base name for the stitched PNG.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYes
nextYes
passYes
tilesYes
detailsNoWhat each detail preview shows, in order
originalYes
warningsNo
referenceYes
nativeLongEdgeNoAbout how many pixels of model-rendered detail the long edge carries, limited by the least detailed tile and at most the output's long edge; 0 when unknown or when part of the image has none

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly=false, destructive=false, idempotent=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: free/local, saves a large PNG with a default long edge, rejected tiles keep prior pixels, and it returns a preview plus seam crops. It stops short of explaining overwrite behavior for outputName or job lifecycle details.

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?

Three tightly packed sentences with no wasted words: step context and action first, then free/local status, then rejected-tile behavior and output. Every sentence earns its place and the important constraints are front-loaded.

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

Completeness5/5

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

Given rich structured support (100% schema coverage, annotations, output schema) and a clear process description, the definition is complete enough. It explains the main mutation, side effects on rejected tiles, and return previews without needing to repeat return values from the output schema.

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 all six parameters are already documented in the schema. The description reinforces some meaning (tiles as edited tile outputs, colorMatch as broad color matching, details as 100% crops) but adds no syntax or format details beyond what the schema provides. Baseline 3 is appropriate.

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?

States a specific verb (align, blend, save) and resource (edited tiles into one large PNG), and situates it as 'Upscale step 3' referencing tile_image. An agent can distinguish it from siblings like tile_image or edit_image without opening another schema.

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 'Upscale step 3' and 'each edited tile from tile_image' clearly imply this should be used after tile_image/edit_image in a workflow. It provides strong context but does not explicitly state when-not to use it or name alternatives by their tool names.

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

tile_imageTile image for upscalingA

Upscale step 1: cut an image into crops shaped to the edit model's aspect ratios. longEdge sets the target (1K-16K, default 8K); with grid and imageSize omitted it picks the cheapest plan that covers it (one tile up to about 4K, a 2x2-4x4 grid beyond). regions re-render faces or text in a later pass. Free and local; reports the edit cost. Step 2: edit_image each crop as the result says. Step 3: stitch_tiles. Detail is invented, not recovered.

ParametersJSON Schema
NameRequiredDescriptionDefault
gridNoCut a grid x grid layout covering the whole image (1-4). Omit it on a first pass to let tile_image pick the cheapest grid that covers longEdge (explained in planNote); a later full-grid pass defaults to 3. Ignored when regions are given.
imageYesThe image to cut: the original photo for the first pass, or the previous stitch_tiles result for a refinement pass. File path, gemini-media:// URI or data: URI.
modelNoImage model the tiles will be edited with (default: the server's default image model; a refinement pass defaults to the model of the pass before). Sets the supported aspect ratios and the cost estimate.
paddingNoContext added around each cell or region, as a fraction of its size (default 0.2, 0.05-0.5). Tiles then grow to the nearest aspect ratio the model supports.
regionsNoRefinement pass: up to 12 areas to re-render (faces, hands, text, materials), as fractions of the image. Omit for a full grid.
longEdgeNoLong edge in pixels of the image stitch_tiles will produce (default 8192, 1024-16384, at most 70 megapixels). First pass only; later passes keep their input's size.
originalNoFirst pass only: the untouched original, sent with every tile as context (as a copy of at most 2048 px). Defaults to image. Refinement passes edit crops alone and keep the first pass's original, so it is ignored there.
imageSizeNoSize the tiles will be edited at (1K, 2K or 4K, as the model supports). Omit it on a first pass to pick it with the grid; otherwise it defaults to the model's largest size.
outputNameNoOptional base name for the crops and the stitched result. Defaults to the original's name.

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobYesPass it to stitch_tiles
costYesEstimated cost of editing every tile once (tile_image itself is free)
gridNoGrid size used (grid mode): 1 is the whole image as one tile
modeYesgrid or regions
nextYes
passYes
imageYesSize of the tiled image
modelYes
tilesYes
outputYesSize stitch_tiles will produce
promptYesBase edit_image prompt for every tile of this pass: it keeps each crop's framing. The gemini-upscale skill adds clauses for skin, eyes, hair, text and other materials.
planNoteNoWhy this grid and imageSize were chosen, when picked automatically
warningsNo
imageSizeYes
referenceNoFirst pass only: a copy of the original (at most 2048 px) to pass as edit_image referenceImages for every tile. Refinement passes edit each crop alone.
nativeLongEdgeNoAbout how many pixels of model-rendered detail the output's long edge carries if every tile comes back at imageSize, at most the output's long edge; below it the rest is interpolated

TDQS

A4.6/5.0
Behavior4/5

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

Adds real context beyond the annotations: 'Free and local; reports the edit cost' and the important caveat 'Detail is invented, not recovered' — a quality warning the readOnlyHint/destructiveHint flags cannot convey. It stops short of disclosing that crops are written to disk or discussing repeat-call behavior, which matters given idempotentHint=false.

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?

Front-loaded with the action statement, then the pipeline, then the caveat; every sentence carries information. It is dense (long parentheticals and a semicolon chain in sentence two) but not padded — each clause encodes a default, a range, or a routing rule.

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

Completeness5/5

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

With nine parameters yet only one required, an output schema covering returns, and annotations covering safety, the description supplies exactly the missing layer: first-pass vs refinement-pass semantics, defaults, cost transparency, and the honesty caveat. Nothing an agent needs to invoke it correctly is absent.

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?

Schema coverage is already 100%, so the 3 baseline applies, but the description goes further by explaining cross-parameter behavior the schema cannot: omitting grid and imageSize picks the cheapest covering plan (one tile up to ~4K, 2x2–4x4 beyond), and that later passes keep their input's size. Only padding/outputName get no extra narrative.

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?

Opens with a specific verb+resource+scope ('cut an image into crops shaped to the edit model's aspect ratios') and immediately situates itself as step 1 of a three-step pipeline whose other steps are named siblings (edit_image, stitch_tiles). An agent can distinguish it from generate_image or edit_image without opening any schema.

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?

Explicit sequencing: 'Step 2: edit_image each crop', 'Step 3: stitch_tiles', and 'regions re-render faces or text in a later pass' tells the agent exactly when each mode applies. It also states the fallback behavior when grid and imageSize are omitted, so the agent knows it can call with only the required image.

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.

  1. 19 tool updatesv1.1.0
    • Removedanimate_image
    • Removedcompose_images
    • Removeddownload_video
    • Changededit_image18 fields changed
      • addedInput schema / properties / approvedCostUsd
        Added value: +{
        +  "description": "Only needed above the confirmation threshold: the cost in USD the user approved.",
        +  "type": "number"
        +}
      • addedInput schema / properties / aspectRatio
        Added value: +{
        +  "description": "Change the aspect ratio (outpainting). Omit to keep the source ratio.",
        +  "type": "string"
        +}
      • addedInput schema / properties / image
        Added value: +{
        +  "description": "The image to edit: file path, gemini-media:// URI from an earlier result, or data: URI.",
        +  "type": "string"
        +}
      • removedInput schema / properties / imagePath
        Removed value: -{
        -  "description": "Path to the image to edit",
        -  "type": "string"
        -}
      • addedInput schema / properties / imageSize
        Added value: +{
        +  "description": "Output size: 1K, 2K or 4K (512 only on the deprecated gemini-3.1-flash-image).",
        +  "type": "string"
        +}
      • changedInput schema / properties / model / description
        Previous value: -"Model tier: nb2 (default) or pro"New value: +"Model ID or alias. Defaults to the model that created the source image, else nb2."
      • addedInput schema / properties / outputName
        Added value: +{
        +  "description": "Optional base file name for the saved file. Defaults to the source name plus -edit.",
        +  "type": "string"
        +}
      • changedInput schema / properties / prompt / description
        Previous value: -"Text description of the edit to apply"New value: +"The change to make, stated specifically, plus what must stay the same (e.g. 'Replace the sky with a sunset; keep the people, framing and lighting on faces unchanged')."
      • addedInput schema / properties / referenceImages
        Added value: +{
        +  "description": "Optional extra images to pull elements or style from (e.g. 'put the logo from image 2 on the mug').",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedInput schema / required
        Previous value: -[
        -  "prompt",
        -  "imagePath"
        -]New value: +[
        +  "image",
        +  "prompt"
        +]
      • addedOutput schema / properties / cost
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "basis": {
        +      "description": "How usd was derived: usage_metadata, unit_params, token_estimate or unpriced",
        +      "type": "string"
        +    },
        +    "breakdown": {
        +      "type": "string"
        +    },
        +    "estimatedUsd": {
        +      "description": "Estimate computed before the call from the price table",
        +      "type": "number"
        +    },
        +    "pending": {
        +      "description": "True while a video job is still running (cost is reserved, not final)",
        +      "type": "boolean"
        +    },
        +    "priceAsOf": {
        +      "type": "string"
        +    },
        +    "usd": {
        +      "description": "Best-known cost in USD; reconciled from token usage when the API reports it",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "estimatedUsd",
        +    "usd",
        +    "basis"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / properties / filePath
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / files
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "bytes": {
        +        "type": "integer"
        +      },
        +      "durationSeconds": {
        +        "type": "number"
        +      },
        +      "height": {
        +        "type": "integer"
        +      },
        +      "mimeType": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "path": {
        +        "description": "Absolute path of the saved file on the server's filesystem",
        +        "type": "string"
        +      },
        +      "uri": {
        +        "description": "MCP resource URI; pass it back as an input to other tools or read it with resources/read",
        +        "type": "string"
        +      },
        +      "width": {
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "path",
        +      "uri",
        +      "name",
        +      "mimeType",
        +      "bytes"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / grounding
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Google Search queries the model ran and the pages it used (googleSearch only)",
        +  "properties": {
        +    "queries": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "sources": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "title": {
        +            "type": "string"
        +          },
        +          "uri": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "uri"
        +        ],
        +        "type": "object"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    }
        +  },
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • removedOutput schema / properties / mimeType
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / text
        Added value: +{
        +  "description": "Commentary the model returned alongside the image(s)",
        +  "type": "string"
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "filePath",
        -  "model",
        -  "mimeType"
        -]New value: +[
        +  "files",
        +  "model",
        +  "cost"
        +]
    • Addededit_video
    • Addedestimate_cost
    • Changedextend_video21 fields changed
      • addedInput schema / properties / approvedCostUsd
        Added value: +{
        +  "description": "Only needed above the confirmation threshold.",
        +  "type": "number"
        +}
      • addedInput schema / properties / jobId
        Added value: +{
        +  "description": "Job handle of a completed generate_video or extend_video call (operation names from older versions also work).",
        +  "type": "string"
        +}
      • removedInput schema / properties / model
        Removed value: -{
        -  "description": "Model tier (must match original). Standard and Fast only, Lite does not support extension",
        -  "type": "string"
        -}
      • addedInput schema / properties / negativePrompt
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / operationId
        Removed value: -{
        -  "description": "Operation ID of the previous video generation",
        -  "type": "string"
        -}
      • addedInput schema / properties / outputName
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / prompt / description
        Previous value: -"Text description for the continuation"New value: +"What happens next. Veo adds about 7 seconds (720p) from the last second; omni adds up to 10 seconds using the last 10 seconds as context."
      • addedInput schema / properties / seed
        Added value: +{
        +  "description": "Vertex AI only.",
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedInput schema / properties / waitSeconds
        Added value: +{
        +  "description": "Block up to this many seconds for the result (default 0).",
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "prompt",
        -  "operationId"
        -]New value: +[
        +  "jobId",
        +  "prompt"
        +]
      • addedOutput schema / properties / cost
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "basis": {
        +      "description": "How usd was derived: usage_metadata, unit_params, token_estimate or unpriced",
        +      "type": "string"
        +    },
        +    "breakdown": {
        +      "type": "string"
        +    },
        +    "estimatedUsd": {
        +      "description": "Estimate computed before the call from the price table",
        +      "type": "number"
        +    },
        +    "pending": {
        +      "description": "True while a video job is still running (cost is reserved, not final)",
        +      "type": "boolean"
        +    },
        +    "priceAsOf": {
        +      "type": "string"
        +    },
        +    "usd": {
        +      "description": "Best-known cost in USD; reconciled from token usage when the API reports it",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "estimatedUsd",
        +    "usd",
        +    "basis"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / elapsedSeconds
        Added value: +{
        +  "type": "integer"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / files
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "bytes": {
        +        "type": "integer"
        +      },
        +      "durationSeconds": {
        +        "type": "number"
        +      },
        +      "height": {
        +        "type": "integer"
        +      },
        +      "mimeType": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "path": {
        +        "description": "Absolute path of the saved file on the server's filesystem",
        +        "type": "string"
        +      },
        +      "uri": {
        +        "description": "MCP resource URI; pass it back as an input to other tools or read it with resources/read",
        +        "type": "string"
        +      },
        +      "width": {
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "path",
        +      "uri",
        +      "name",
        +      "mimeType",
        +      "bytes"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / jobId
        Added value: +{
        +  "description": "Opaque handle; pass it to get_video, extend_video or edit_video",
        +  "type": "string"
        +}
      • addedOutput schema / properties / next
        Added value: +{
        +  "description": "Suggested next step",
        +  "type": "string"
        +}
      • removedOutput schema / properties / operationId
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / remoteExpiresAt
        Added value: +{
        +  "description": "When Google deletes the server-side copy; extend before this time",
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
      • addedOutput schema / properties / state
        Added value: +{
        +  "description": "working, completed, failed or filtered",
        +  "type": "string"
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "operationId",
        -  "model"
        -]New value: +[
        +  "jobId",
        +  "state",
        +  "model",
        +  "elapsedSeconds",
        +  "cost"
        +]
    • Removedgenerate_audio
    • Changedgenerate_image18 fields changed
      • addedInput schema / properties / approvedCostUsd
        Added value: +{
        +  "description": "Only needed when a call exceeds the configured confirmation threshold: the cost in USD the user approved.",
        +  "type": "number"
        +}
      • changedInput schema / properties / aspectRatio / description
        Previous value: -"Aspect ratio (1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9)"New value: +"e.g. 1:1, 3:2, 2:3, 4:3, 3:4, 4:5, 16:9, 9:16, 21:9 (nb2 also 1:4, 4:1, 1:8, 8:1). Defaults to 1:1 when there are no reference images; with them the model usually follows the first image's ratio."
      • addedInput schema / properties / count
        Added value: +{
        +  "description": "Number of variations to generate in parallel (1-4, default 1). Each is billed.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / googleSearch
        Added value: +{
        +  "description": "Ground the image in Google Search results (current events, real places, data for infographics).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / imageSize
        Added value: +{
        +  "description": "Output size: 1K (default), 2K or 4K. Larger costs more. 512 only on the deprecated gemini-3.1-flash-image.",
        +  "type": "string"
        +}
      • changedInput schema / properties / model / description
        Previous value: -"Model tier: nb2 (default) or pro. Raw model IDs also accepted"New value: +"Model ID or alias. nb2 (default: Nano Banana 2.1, fast and cheap), pro (Nano Banana Pro, highest fidelity for dense scenes), nb2-lite (cheapest inputs). See list_models."
      • addedInput schema / properties / outputName
        Added value: +{
        +  "description": "Optional base file name (without extension) for the saved file(s).",
        +  "type": "string"
        +}
      • changedInput schema / properties / prompt / description
        Previous value: -"Text description of the image to generate"New value: +"What to create. Describe subject, setting, composition, lighting and style in full sentences. Put any exact text to render in quotes."
      • addedInput schema / properties / referenceImages
        Added value: +{
        +  "description": "Optional images to guide the result (subjects, products, characters, style): file paths, gemini-media:// URIs from earlier results, or data: URIs. Up to 14 for nb2/pro.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • removedInput schema / properties / resolution
        Removed value: -{
        -  "description": "Output resolution (1K, 2K, 4K)",
        -  "type": "string"
        -}
      • addedOutput schema / properties / cost
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "basis": {
        +      "description": "How usd was derived: usage_metadata, unit_params, token_estimate or unpriced",
        +      "type": "string"
        +    },
        +    "breakdown": {
        +      "type": "string"
        +    },
        +    "estimatedUsd": {
        +      "description": "Estimate computed before the call from the price table",
        +      "type": "number"
        +    },
        +    "pending": {
        +      "description": "True while a video job is still running (cost is reserved, not final)",
        +      "type": "boolean"
        +    },
        +    "priceAsOf": {
        +      "type": "string"
        +    },
        +    "usd": {
        +      "description": "Best-known cost in USD; reconciled from token usage when the API reports it",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "estimatedUsd",
        +    "usd",
        +    "basis"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / properties / filePath
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / files
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "bytes": {
        +        "type": "integer"
        +      },
        +      "durationSeconds": {
        +        "type": "number"
        +      },
        +      "height": {
        +        "type": "integer"
        +      },
        +      "mimeType": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "path": {
        +        "description": "Absolute path of the saved file on the server's filesystem",
        +        "type": "string"
        +      },
        +      "uri": {
        +        "description": "MCP resource URI; pass it back as an input to other tools or read it with resources/read",
        +        "type": "string"
        +      },
        +      "width": {
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "path",
        +      "uri",
        +      "name",
        +      "mimeType",
        +      "bytes"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / grounding
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Google Search queries the model ran and the pages it used (googleSearch only)",
        +  "properties": {
        +    "queries": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "sources": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "title": {
        +            "type": "string"
        +          },
        +          "uri": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "uri"
        +        ],
        +        "type": "object"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    }
        +  },
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • removedOutput schema / properties / mimeType
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / text
        Added value: +{
        +  "description": "Commentary the model returned alongside the image(s)",
        +  "type": "string"
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "filePath",
        -  "model",
        -  "mimeType"
        -]New value: +[
        +  "files",
        +  "model",
        +  "cost"
        +]
    • Changedgenerate_music18 fields changed
      • addedInput schema / properties / approvedCostUsd
        Added value: +{
        +  "description": "Only needed above the confirmation threshold.",
        +  "type": "number"
        +}
      • addedInput schema / properties / bpm
        Added value: +{
        +  "description": "Optional tempo hint in beats per minute.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / durationSeconds
        Added value: +{
        +  "description": "Optional target length hint for full songs (clip is always 30s).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / format
        Added value: +{
        +  "description": "mp3 (default) or wav (full model only).",
        +  "type": "string"
        +}
      • addedInput schema / properties / images
        Added value: +{
        +  "description": "Optional images (up to 10) whose mood or scene should inspire the music.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedInput schema / properties / instrumental
        Added value: +{
        +  "description": "Ask for no vocals.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / lyrics
        Added value: +{
        +  "description": "Optional lyrics with section tags; they are sung in the language they are written in.",
        +  "type": "string"
        +}
      • changedInput schema / properties / model / description
        Previous value: -"Model: clip (default, 30s clips) or full (up to 3 minutes, full songs with structure control)"New value: +"clip (default: 30-second MP3, cheapest) or full (complete song up to about 3 minutes, vocals, WAV option). See list_models."
      • addedInput schema / properties / outputName
        Added value: +{
        +  "description": "Optional base file name.",
        +  "type": "string"
        +}
      • changedInput schema / properties / prompt / description
        Previous value: -"Text description of the music to generate. Supports genre, instruments, BPM, key, mood, structure tags like [Verse] [Chorus] [Bridge], and custom lyrics"New value: +"Describe the music: genre, mood, instruments, tempo, key, production style and song structure. Use [Intro]/[Verse]/[Chorus]/[Bridge]/[Outro] tags or [0:00-0:15] timestamps to control sections."
      • addedOutput schema / properties / cost
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "basis": {
        +      "description": "How usd was derived: usage_metadata, unit_params, token_estimate or unpriced",
        +      "type": "string"
        +    },
        +    "breakdown": {
        +      "type": "string"
        +    },
        +    "estimatedUsd": {
        +      "description": "Estimate computed before the call from the price table",
        +      "type": "number"
        +    },
        +    "pending": {
        +      "description": "True while a video job is still running (cost is reserved, not final)",
        +      "type": "boolean"
        +    },
        +    "priceAsOf": {
        +      "type": "string"
        +    },
        +    "usd": {
        +      "description": "Best-known cost in USD; reconciled from token usage when the API reports it",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "estimatedUsd",
        +    "usd",
        +    "basis"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / durationSeconds
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / file
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "bytes": {
        +      "type": "integer"
        +    },
        +    "durationSeconds": {
        +      "type": "number"
        +    },
        +    "height": {
        +      "type": "integer"
        +    },
        +    "mimeType": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "path": {
        +      "description": "Absolute path of the saved file on the server's filesystem",
        +      "type": "string"
        +    },
        +    "uri": {
        +      "description": "MCP resource URI; pass it back as an input to other tools or read it with resources/read",
        +      "type": "string"
        +    },
        +    "width": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "path",
        +    "uri",
        +    "name",
        +    "mimeType",
        +    "bytes"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / properties / filePath
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / lyrics / description
        Added value: +"Lyrics or song structure returned by the model"
      • removedOutput schema / properties / mimeType
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "filePath",
        -  "model",
        -  "mimeType"
        -]New value: +[
        +  "file",
        +  "model",
        +  "cost"
        +]
    • Addedgenerate_speech
    • Changedgenerate_video27 fields changed
      • addedInput schema / properties / approvedCostUsd
        Added value: +{
        +  "description": "Only needed above the confirmation threshold: the cost in USD the user approved.",
        +  "type": "number"
        +}
      • changedInput schema / properties / aspectRatio / description
        Previous value: -"Aspect ratio (16:9 or 9:16)"New value: +"16:9 (default) or 9:16"
      • removedInput schema / properties / duration
        Removed value: -{
        -  "description": "Clip duration in seconds (4, 6, or 8)",
        -  "type": "integer"
        -}
      • addedInput schema / properties / durationSeconds
        Added value: +{
        +  "description": "Clip length: Veo 4, 6 or 8 seconds; omni 3-10 seconds (default 8).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / generateAudio
        Added value: +{
        +  "description": "Vertex AI only: set false for silent video at a lower price. The Gemini API always generates audio.",
        +  "type": [
        +    "null",
        +    "boolean"
        +  ]
        +}
      • addedInput schema / properties / image
        Added value: +{
        +  "description": "Optional first frame (image-to-video): file path, gemini-media:// URI or data: URI.",
        +  "type": "string"
        +}
      • addedInput schema / properties / lastFrame
        Added value: +{
        +  "description": "Optional last frame; requires image. Veo interpolates between the two.",
        +  "type": "string"
        +}
      • changedInput schema / properties / model / description
        Previous value: -"Model tier: lite (default/cheapest), fast, or standard (highest quality). Raw model IDs also accepted"New value: +"Model ID or alias: omni (default on the Gemini API: Gemini Omni Flash, best prompt adherence, editable and extendable to 40 s), lite (cheapest Veo; the default on Vertex AI), fast (Veo 4K, ingredients) or standard (highest Veo quality). Veo is leaving the Gemini API: list_models shows its shutdown date. See list_models."
      • addedInput schema / properties / negativePrompt
        Added value: +{
        +  "description": "What to avoid, as plain nouns (e.g. 'text overlays, blur'). For omni it is appended to the prompt.",
        +  "type": "string"
        +}
      • addedInput schema / properties / outputName
        Added value: +{
        +  "description": "Optional base file name for the saved video.",
        +  "type": "string"
        +}
      • addedInput schema / properties / personGeneration
        Added value: +{
        +  "description": "allow_all, allow_adult or dont_allow. The Gemini API requires allow_all for text-to-video and allow_adult for image-based modes.",
        +  "type": "string"
        +}
      • changedInput schema / properties / prompt / description
        Previous value: -"Text description of the video to generate. Include audio cues for sound design"New value: +"What happens in the clip: subject and action, camera movement, setting, lighting, style, and sound (dialogue in quotes, sound effects, ambience, music)."
      • addedInput schema / properties / referenceImages
        Added value: +{
        +  "description": "Images of characters, objects, products or styles to keep consistent: Veo fast/standard up to 3 (forces 8s, not with image/lastFrame); omni up to 10 including frames (name them <IMAGE_REF_0>... in the prompt).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedInput schema / properties / resolution / description
        Previous value: -"Output resolution: 720p, 1080p, or 4k (lite supports 720p/1080p only)"New value: +"720p (default), 1080p or 4k (not lite); omni also 360p for fast drafts. Veo 1080p and 4k require 8-second clips."
      • addedInput schema / properties / seed
        Added value: +{
        +  "description": "Seed for more repeatable results (Vertex AI only; ignored on the Gemini API).",
        +  "type": [
        +    "null",
        +    "integer"
        +  ]
        +}
      • addedInput schema / properties / waitSeconds
        Added value: +{
        +  "description": "Block up to this many seconds for the result (default 0 = return a job handle immediately). Keep under your client's tool timeout.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / cost
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "basis": {
        +      "description": "How usd was derived: usage_metadata, unit_params, token_estimate or unpriced",
        +      "type": "string"
        +    },
        +    "breakdown": {
        +      "type": "string"
        +    },
        +    "estimatedUsd": {
        +      "description": "Estimate computed before the call from the price table",
        +      "type": "number"
        +    },
        +    "pending": {
        +      "description": "True while a video job is still running (cost is reserved, not final)",
        +      "type": "boolean"
        +    },
        +    "priceAsOf": {
        +      "type": "string"
        +    },
        +    "usd": {
        +      "description": "Best-known cost in USD; reconciled from token usage when the API reports it",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "estimatedUsd",
        +    "usd",
        +    "basis"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / elapsedSeconds
        Added value: +{
        +  "type": "integer"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / files
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "bytes": {
        +        "type": "integer"
        +      },
        +      "durationSeconds": {
        +        "type": "number"
        +      },
        +      "height": {
        +        "type": "integer"
        +      },
        +      "mimeType": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "path": {
        +        "description": "Absolute path of the saved file on the server's filesystem",
        +        "type": "string"
        +      },
        +      "uri": {
        +        "description": "MCP resource URI; pass it back as an input to other tools or read it with resources/read",
        +        "type": "string"
        +      },
        +      "width": {
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "path",
        +      "uri",
        +      "name",
        +      "mimeType",
        +      "bytes"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / jobId
        Added value: +{
        +  "description": "Opaque handle; pass it to get_video, extend_video or edit_video",
        +  "type": "string"
        +}
      • addedOutput schema / properties / next
        Added value: +{
        +  "description": "Suggested next step",
        +  "type": "string"
        +}
      • removedOutput schema / properties / operationId
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / remoteExpiresAt
        Added value: +{
        +  "description": "When Google deletes the server-side copy; extend before this time",
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
      • addedOutput schema / properties / state
        Added value: +{
        +  "description": "working, completed, failed or filtered",
        +  "type": "string"
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "operationId",
        -  "model"
        -]New value: +[
        +  "jobId",
        +  "state",
        +  "model",
        +  "elapsedSeconds",
        +  "cost"
        +]
    • Changedget_config18 fields changed
      • addedOutput schema / properties / authMode
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / backendReason
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / budget
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "confirmAboveUsd": {
        +      "type": "number"
        +    },
        +    "dailyUsd": {
        +      "type": "number"
        +    },
        +    "monthlyUsd": {
        +      "type": "number"
        +    },
        +    "sessionUsd": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "sessionUsd",
        +    "dailyUsd",
        +    "monthlyUsd",
        +    "confirmAboveUsd"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / catalogFile
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / catalogVersion
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / configFile
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / defaults
        Added value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
      • addedOutput schema / properties / httpAddr
        Added value: +{
        +  "description": "Address the HTTP transport listens on",
        +  "type": "string"
        +}
      • addedOutput schema / properties / inlinePreviews
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / inputPolicy
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / location
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / project
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / settingSources
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / stateDir
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / transport
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / version
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "backend",
        -  "outputDir"
        -]New value: +[
        +  "version",
        +  "backend",
        +  "authMode",
        +  "backendReason",
        +  "transport",
        +  "outputDir",
        +  "stateDir",
        +  "catalogVersion",
        +  "defaults",
        +  "budget",
        +  "inputPolicy",
        +  "inlinePreviews"
        +]
    • Addedget_usage
    • Addedget_video
    • Changedlist_models23 fields changed
      • addedInput schema / properties
        Added value: +{
        +  "detail": {
        +    "description": "Include full capabilities (aspect ratios, voices, rules).",
        +    "type": "boolean"
        +  },
        +  "includeInactive": {
        +    "description": "Also list retired models and their replacements.",
        +    "type": "boolean"
        +  },
        +  "live": {
        +    "description": "Also query the Gemini API for the models this key can use, flagging unavailable ones and media models missing from the catalog.",
        +    "type": "boolean"
        +  },
        +  "mediaType": {
        +    "description": "Filter: image, video, speech or music.",
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / backend
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / catalogVersion
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / models / items / properties / aliases
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • removedOutput schema / properties / models / items / properties / aspectRatios
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": [
        -    "null",
        -    "array"
        -  ]
        -}
      • addedOutput schema / properties / models / items / properties / available
        Added value: +{
        +  "description": "From live check: whether the API lists this model for your key",
        +  "type": [
        +    "null",
        +    "boolean"
        +  ]
        +}
      • addedOutput schema / properties / models / items / properties / capabilities
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "aspectRatios": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "audioToggle": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "defaultDuration": {
        +      "type": "integer"
        +    },
        +    "durations": {
        +      "items": {
        +        "type": "integer"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "edit": {
        +      "type": "boolean"
        +    },
        +    "extend": {
        +      "type": "boolean"
        +    },
        +    "extendSeconds": {
        +      "type": "integer"
        +    },
        +    "geminiApiOnly": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "imageInput": {
        +      "type": "boolean"
        +    },
        +    "imageSizes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "imageToVideo": {
        +      "type": "boolean"
        +    },
        +    "lastFrame": {
        +      "type": "boolean"
        +    },
        +    "maxInputVideoSeconds": {
        +      "type": "integer"
        +    },
        +    "maxOutputSeconds": {
        +      "type": "integer"
        +    },
        +    "maxReferenceImages": {
        +      "type": "integer"
        +    },
        +    "maxSpeakers": {
        +      "type": "integer"
        +    },
        +    "maxTotalSeconds": {
        +      "type": "integer"
        +    },
        +    "negativePrompt": {
        +      "type": "boolean"
        +    },
        +    "outputFormats": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "outputSeconds": {
        +      "type": "integer"
        +    },
        +    "personGeneration": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "resolutions": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "rules": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "message": {
        +            "type": "string"
        +          },
        +          "require": {
        +            "additionalProperties": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": [
        +                "null",
        +                "array"
        +              ]
        +            },
        +            "type": "object"
        +          },
        +          "when": {
        +            "additionalProperties": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": [
        +                "null",
        +                "array"
        +              ]
        +            },
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "when",
        +          "require",
        +          "message"
        +        ],
        +        "type": "object"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "searchGrounding": {
        +      "type": "boolean"
        +    },
        +    "seed": {
        +      "type": "boolean"
        +    },
        +    "speechStyle": {
        +      "type": "string"
        +    },
        +    "vertexOnly": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "videoEdit": {
        +      "type": "boolean"
        +    },
        +    "voices": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    }
        +  },
        +  "type": [
        +    "null",
        +    "object"
        +  ]
        +}
      • addedOutput schema / properties / models / items / properties / default
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / models / items / properties / notes
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / models / items / properties / onBackend
        Added value: +{
        +  "description": "Offered on the active backend",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / models / items / properties / price
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / models / items / properties / pricePerSec
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / models / items / properties / replacement
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / models / items / properties / resolutions
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": [
        -    "null",
        -    "array"
        -  ]
        -}
      • addedOutput schema / properties / models / items / properties / shutdown
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / models / items / properties / status
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / models / items / properties / summary
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / models / items / properties / tier
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / models / items / properties / title
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / models / items / required
        Previous value: -[
        -  "id",
        -  "tier",
        -  "mediaType",
        -  "resolutions",
        -  "aspectRatios"
        -]New value: +[
        +  "id",
        +  "mediaType",
        +  "status",
        +  "price",
        +  "onBackend"
        +]
      • addedOutput schema / properties / uncatalogued
        Added value: +{
        +  "description": "Media models the API offers that the catalog does not know yet (usable by raw ID)",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "models"
        -]New value: +[
        +  "catalogVersion",
        +  "backend",
        +  "models"
        +]
    • Addedstitch_tiles
    • Addedtile_image
    • Removedvideo_status
  2. 12 tool updates
    • First observedanimate_image
    • First observedcompose_images
    • First observeddownload_video
    • First observededit_image
    • First observedextend_video
    • First observedgenerate_audio
    • First observedgenerate_image
    • First observedgenerate_music
    • First observedgenerate_video
    • First observedget_config
    • First observedlist_models
    • First observedvideo_status

TDQS

A4.1/5.0

Scored across 14 tools

Disambiguation4/5

Most tools have distinct resource+action purposes (generate vs edit vs extend for each media type; tile/stitch form a clear two-step pipeline). A few boundaries are softer: estimate_cost vs get_usage both report spend, and get_config vs list_models both expose backend/model info, but descriptions differentiate them adequately.

Naming Consistency5/5

All 14 tools follow a strict snake_case verb_noun pattern (generate_image, edit_video, extend_video, get_video, list_models, stitch_tiles). No mixing of camelCase or inconsistent verb styles.

Tool Count5/5

14 tools is well-scoped for a multi-media generation server covering image, video, speech and music plus cost/utilization helpers. Each tool occupies a distinct slot in the lifecycle rather than duplicating capability.

Completeness4/5

The surface covers generation, editing, extension, upscaling and cost/usage introspection across all four media types, with async job polling handled via get_video. Minor gaps remain, e.g. no explicit audio-video muxing or file management operations, but core workflows have no dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers