gemini-media-mcp
gemini-media-mcp is an MCP server that generates, edits, upscales, and costs-out Google's generative media (images, video, speech, music) via the Gemini API or Vertex AI.
Images —
generate_image(text-to-image, up to 14 reference images, 1K–4K, aspect ratios, 1–4 variations, optional Google Search grounding) andedit_image(add/remove/restyle/relight/outpaint, change aspect ratio, fix text).Upscaling —
tile_imageplans and cuts an image into model-friendly crops (1K–16K targets, grids or face/text regions), thenstitch_tilesaligns, color-matches and blends the edited tiles into one large PNG (8K default) with seam previews.Video —
generate_video(text, first-frame, first+last-frame or reference-image input with native audio; Veo or Gemini Omni Flash, 3–10s),get_video(long-poll async jobs),extend_video(continue a clip up to 40s/148s), andedit_video(restyle/replace elements in a clip or ≤10s file).Speech —
generate_speech: single-voice or two-speaker dialogue WAV with per-line style control, 30 voices and language codes.Music —
generate_music: 30-second clips or full Lyria songs with lyrics, structure tags, BPM, instrumental mode and image inspiration.Cost control —
estimate_costprices and compares models before spending; every result reports its cost;get_usageshows spend by period/model/tool, budgets remaining and running jobs; budgets are enforced and costly calls require approval.Discovery & config —
list_models(aliases, status, prices, capabilities, live key check) andget_config(active backend, output dir, defaults, warnings).Chaining & transport — outputs return file paths plus
gemini-media://URIs that feed back into other tools; runs over stdio or Streamable HTTP, backed by the Gemini API or Vertex AI.
Provides AI media generation capabilities via Google Gemini API, including image generation/editing, video creation with Veo models, text-to-speech, and music generation with Lyria.
gemini-media-mcp
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_costcompares 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
Get credentials. Either:
an API key from Google AI Studio (
GEMINI_API_KEY), ora Google Cloud project with Vertex AI enabled (
GOOGLE_CLOUD_PROJECTplusgcloud auth application-default login).
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 versionOn Windows, download the
windowszip from the latest release and putgemini-media-mcp.exeon 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.
Add the server to your agent. Every config below runs
gemini-media-mcpfrom your PATH.Claude Code (plugin: server plus skills):
/plugin marketplace add mordor-forge/gemini-media-mcp /plugin install gemini-media@mordor-forgeor just the server:
claude mcp add gemini-media -e GEMINI_API_KEY=... -- gemini-media-mcpCodex (
~/.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 defaultGemini CLI (paid API keys, Vertex AI and Gemini Code Assist only, since June 2026):
gemini extensions install https://github.com/mordor-forge/gemini-media-mcpAntigravity CLI: add the server to
~/.gemini/config/mcp_config.json, as shown in the install snippets.Claude Desktop: download
gemini-media-mcp-<version>.mcpbfrom 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-mcpwas not found, it doesn't see your shell's PATH: use the full path fromcommand -v gemini-media-mcp. Every client, plus Docker and the skills installer, is covered in packaging/INSTALL-SNIPPETS.md.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 |
| Text-to-image with up to 14 reference images, 1K–4K, many aspect ratios, 1–4 variations, optional Google Search grounding |
| Change an existing image (add/remove/restyle/relight/outpaint) while keeping the rest |
| 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 |
| Align the edited tiles with the image, match their color, blend the overlaps and save one large PNG (8K by default). Free and local |
| 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 ( |
| Wait for a job (long-poll, default 45 s); downloads the video when done. Safe to repeat |
| Continue a finished clip: Omni adds up to 10 s (40 s total), Veo about 7 s (up to 148 s total) |
| Change a finished clip or a video file of up to 10 s with an instruction (Gemini Omni) |
| Text-to-speech (WAV): one voice, or a two-speaker dialogue, with per-line style control and 30 voices |
| 30-second clips or full songs with lyrics, structure tags, tempo, instrumental mode and image inspiration |
| Current models, aliases, status, prices; |
| Price a request before running it and compare models |
| Estimated spend by period, model and tool; budgets remaining; running jobs |
| 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 |
| Images: generation, editing, multi-reference composition, text rendering |
| Video: text/image-to-video, frame interpolation, reference ingredients, Omni editing, extension, async jobs |
| Voiceovers, narration, two-speaker dialogue, voice and style selection |
| Clips and full songs with structure, lyrics and tempo |
| Multi-asset projects (storyboard → keyframes → video → voiceover → music → ffmpeg assembly) with a budget plan |
| 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 |
|
Video |
|
Speech |
|
Music |
|
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 (or Vertex express-mode key) |
|
| – | Vertex AI project (Application Default Credentials) |
|
| per model | Vertex region; models not offered there use their catalog location |
| – | – |
|
|
|
|
|
|
|
| Where media is saved |
|
|
| Spend ledger and video jobs |
|
| none | Spend caps (estimated) |
|
| none | Calls above this need |
|
| 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) |
|
| – | Catalog override file (hot-reloaded) |
|
| – | Extra directories inputs may be read from (HTTP mode) |
|
|
| Read input files from anywhere on disk |
|
|
| Attach a downscaled preview to image results, and its longest side |
|
|
| Timeout of each Google API request |
|
|
| Upper limit for |
|
|
| Attempts for rate-limited (429) and unavailable (503) responses |
|
|
|
|
|
|
|
|
|
|
| HTTP listen address and bearer token |
– |
|
| HTTP endpoint path |
|
| – | Extra trusted browser origins, comma-separated |
|
|
| Keep per-client sessions (only for legacy 2025-11-25 clients that need them) |
How the backend is chosen:
An explicit
backendsetting wins.Otherwise the SDK switches
GOOGLE_GENAI_USE_ENTERPRISEandGOOGLE_GENAI_USE_VERTEXAIdecide.Otherwise an API key selects the Gemini API, even if
GOOGLE_CLOUD_PROJECTis set in your shell for other tools.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_usageandgemini-media-mcp usagesummarize 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 withapprovedCostUsd.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(unlessGEMINI_MEDIA_ALLOW_ANY_INPUT_PATH=true).GET /healthzreports 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 filesAGENTS.md: guide for coding agents and contributors.
docs/architecture-review.md: architecture and design decisions.
internal/catalog/models.yaml: model catalog. When Google changes models, edit this file, not the code.
License
Available Tools
14 toolsedit_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.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | The image to edit: file path, gemini-media:// URI from an earlier result, or data: URI. | |
| model | No | Model ID or alias. Defaults to the model that created the source image, else nb2. | |
| prompt | Yes | 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'). | |
| imageSize | No | Output size: 1K, 2K or 4K (512 only on the deprecated gemini-3.1-flash-image). | |
| outputName | No | Optional base file name for the saved file. Defaults to the source name plus -edit. | |
| aspectRatio | No | Change the aspect ratio (outpainting). Omit to keep the source ratio. | |
| approvedCostUsd | No | Only needed above the confirmation threshold: the cost in USD the user approved. | |
| referenceImages | No | Optional extra images to pull elements or style from (e.g. 'put the logo from image 2 on the mug'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | Yes | |
| text | No | Commentary the model returned alongside the image(s) |
| files | Yes | |
| model | Yes | |
| warnings | No | |
| grounding | No | Google Search queries the model ran and the pages it used (googleSearch only) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | No | A 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. | |
| model | No | Model ID or alias; default omni (the only model that edits videos). | |
| video | No | Or a video file to edit: file path, gemini-media:// URI or data: URI. At most 10 seconds and 20 MB. | |
| prompt | Yes | The change, stated simply, ending with 'Keep everything else the same.' (e.g. 'Make the phone invisible. Keep everything else the same.') | |
| outputName | No | Optional base file name for the saved video. Defaults to the source name plus -edit. | |
| resolution | No | 360p, 720p (default), 1080p or 4k (1080p and 4k are upscaled). | |
| waitSeconds | No | Block up to this many seconds for the result (default 0 = return a job handle immediately). Keep under your client's tool timeout. | |
| approvedCostUsd | No | Only needed above the confirmation threshold: the cost in USD the user approved. | |
| referenceImages | No | Optional images to bring into the clip; refer to them as <IMAGE_REF_0>, <IMAGE_REF_1>... in the prompt. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | Yes | |
| next | No | Suggested next step |
| error | No | |
| files | No | |
| jobId | Yes | Opaque handle; pass it to get_video, extend_video or edit_video |
| model | Yes | |
| state | Yes | working, completed, failed or filtered |
| warnings | No | |
| elapsedSeconds | Yes | |
| remoteExpiresAt | No | When Google deletes the server-side copy; extend before this time |
TDQS
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.
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.
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.
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.
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.
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 costARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Speech: the text to be spoken (length drives cost) | |
| count | No | Number of images/clips/songs (default 1) | |
| model | No | Model ID or alias (default model when omitted) | |
| compare | No | Also estimate the same request on every other active model of this media type | |
| imageSize | No | Images: 512, 1K, 2K or 4K | |
| mediaType | Yes | image, video, speech or music | |
| resolution | No | Video: 720p, 1080p or 4k (Omni also 360p) | |
| inputImages | No | Images: number of reference/source images | |
| generateAudio | No | Video on Vertex AI: false for the cheaper silent rate | |
| durationSeconds | No | Video: clip length (default 8) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| model | Yes | |
| estimate | Yes | |
| warnings | No | Lifecycle notices (deprecation, shutdown, replacement) and budget problems |
| alternatives | No | |
| needsApproval | Yes | True when the call would exceed the confirmation threshold and needs approvedCostUsd |
| budgetRemaining | No | |
| wouldExceedBudget | No | True when a budget would refuse this call right now (see warnings) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | Vertex AI only. | |
| jobId | Yes | Job handle of a completed generate_video or extend_video call (operation names from older versions also work). | |
| prompt | Yes | 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. | |
| outputName | No | ||
| waitSeconds | No | Block up to this many seconds for the result (default 0). | |
| negativePrompt | No | ||
| approvedCostUsd | No | Only needed above the confirmation threshold. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | Yes | |
| next | No | Suggested next step |
| error | No | |
| files | No | |
| jobId | Yes | Opaque handle; pass it to get_video, extend_video or edit_video |
| model | Yes | |
| state | Yes | working, completed, failed or filtered |
| warnings | No | |
| elapsedSeconds | Yes | |
| remoteExpiresAt | No | When Google deletes the server-side copy; extend before this time |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of variations to generate in parallel (1-4, default 1). Each is billed. | |
| model | No | 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. | |
| prompt | Yes | What to create. Describe subject, setting, composition, lighting and style in full sentences. Put any exact text to render in quotes. | |
| imageSize | No | Output size: 1K (default), 2K or 4K. Larger costs more. 512 only on the deprecated gemini-3.1-flash-image. | |
| outputName | No | Optional base file name (without extension) for the saved file(s). | |
| aspectRatio | No | 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. | |
| googleSearch | No | Ground the image in Google Search results (current events, real places, data for infographics). | |
| approvedCostUsd | No | Only needed when a call exceeds the configured confirmation threshold: the cost in USD the user approved. | |
| referenceImages | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | Yes | |
| text | No | Commentary the model returned alongside the image(s) |
| files | Yes | |
| model | Yes | |
| warnings | No | |
| grounding | No | Google Search queries the model ran and the pages it used (googleSearch only) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | Optional tempo hint in beats per minute. | |
| model | No | clip (default: 30-second MP3, cheapest) or full (complete song up to about 3 minutes, vocals, WAV option). See list_models. | |
| format | No | mp3 (default) or wav (full model only). | |
| images | No | Optional images (up to 10) whose mood or scene should inspire the music. | |
| lyrics | No | Optional lyrics with section tags; they are sung in the language they are written in. | |
| prompt | Yes | 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. | |
| outputName | No | Optional base file name. | |
| instrumental | No | Ask for no vocals. | |
| approvedCostUsd | No | Only needed above the confirmation threshold. | |
| durationSeconds | No | Optional target length hint for full songs (clip is always 30s). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | Yes | |
| file | Yes | |
| model | Yes | |
| lyrics | No | Lyrics or song structure returned by the model |
| warnings | No | |
| durationSeconds | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | The 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. | |
| model | No | Model ID or alias: tts (default, Gemini 3.8 Flash TTS), tts-lite (cheaper). See list_models. | |
| style | No | How to deliver the lines, e.g. 'warm and enthusiastic', 'whispered urgently', 'slow, calm narrator'. | |
| voice | No | Voice for single-speaker text, e.g. Kore (firm), Puck (upbeat), Charon (informative), Aoede (breezy, default), Zephyr (bright). list_models shows all 30. | |
| format | No | wav (default) or pcm (raw 16-bit little-endian). | |
| dialogue | No | Alternative to text: a conversation between up to 2 named speakers, one entry per line. | |
| speakers | No | Voice per dialogue speaker; unlisted speakers get distinct defaults. | |
| outputName | No | Optional base file name. | |
| languageCode | No | Optional BCP-47 code (e.g. en-US, it-IT). Usually auto-detected from the text. | |
| approvedCostUsd | No | Only needed above the confirmation threshold. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | Yes | |
| file | Yes | |
| model | Yes | |
| voices | Yes | |
| warnings | No | |
| durationSeconds | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | Seed for more repeatable results (Vertex AI only; ignored on the Gemini API). | |
| image | No | Optional first frame (image-to-video): file path, gemini-media:// URI or data: URI. | |
| model | No | 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. | |
| prompt | Yes | What happens in the clip: subject and action, camera movement, setting, lighting, style, and sound (dialogue in quotes, sound effects, ambience, music). | |
| lastFrame | No | Optional last frame; requires image. Veo interpolates between the two. | |
| outputName | No | Optional base file name for the saved video. | |
| resolution | No | 720p (default), 1080p or 4k (not lite); omni also 360p for fast drafts. Veo 1080p and 4k require 8-second clips. | |
| aspectRatio | No | 16:9 (default) or 9:16 | |
| waitSeconds | No | Block up to this many seconds for the result (default 0 = return a job handle immediately). Keep under your client's tool timeout. | |
| generateAudio | No | Vertex AI only: set false for silent video at a lower price. The Gemini API always generates audio. | |
| negativePrompt | No | What to avoid, as plain nouns (e.g. 'text overlays, blur'). For omni it is appended to the prompt. | |
| approvedCostUsd | No | Only needed above the confirmation threshold: the cost in USD the user approved. | |
| durationSeconds | No | Clip length: Veo 4, 6 or 8 seconds; omni 3-10 seconds (default 8). | |
| referenceImages | No | 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). | |
| personGeneration | No | allow_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
| Name | Required | Description |
|---|---|---|
| cost | Yes | |
| next | No | Suggested next step |
| error | No | |
| files | No | |
| jobId | Yes | Opaque handle; pass it to get_video, extend_video or edit_video |
| model | Yes | |
| state | Yes | working, completed, failed or filtered |
| warnings | No | |
| elapsedSeconds | Yes | |
| remoteExpiresAt | No | When Google deletes the server-side copy; extend before this time |
TDQS
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.
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.
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.
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.
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.
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 configurationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| budget | Yes | |
| backend | Yes | |
| project | No | |
| version | Yes | |
| authMode | Yes | |
| defaults | Yes | |
| httpAddr | No | Address the HTTP transport listens on |
| location | No | |
| stateDir | Yes | |
| warnings | No | |
| outputDir | Yes | |
| transport | Yes | |
| configFile | No | |
| catalogFile | No | |
| inputPolicy | Yes | |
| backendReason | Yes | |
| catalogVersion | Yes | |
| inlinePreviews | Yes | |
| settingSources | No |
TDQS
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.
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.
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.
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.
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.
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 spendARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | session (since this server started), today (default), month or all | |
| recent | No | How many recent entries to include (default 10, max 100) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| extra | No | |
| budget | Yes | |
| period | Yes | |
| summary | Yes | |
| activeJobs | No | |
| ledgerPath | Yes |
TDQS
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.
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.
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.
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.
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.
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 jobAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Job handle returned by generate_video, extend_video or edit_video. | |
| waitSeconds | No | Block up to this many seconds for completion (default 45, 0 = check once). The video is downloaded automatically when ready. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | Yes | |
| next | No | Suggested next step |
| error | No | |
| files | No | |
| jobId | Yes | Opaque handle; pass it to get_video, extend_video or edit_video |
| model | Yes | |
| state | Yes | working, completed, failed or filtered |
| warnings | No | |
| elapsedSeconds | Yes | |
| remoteExpiresAt | No | When Google deletes the server-side copy; extend before this time |
TDQS
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.
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.
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.
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.
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.
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 modelsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | Also query the Gemini API for the models this key can use, flagging unavailable ones and media models missing from the catalog. | |
| detail | No | Include full capabilities (aspect ratios, voices, rules). | |
| mediaType | No | Filter: image, video, speech or music. | |
| includeInactive | No | Also list retired models and their replacements. |
Output Schema
| Name | Required | Description |
|---|---|---|
| models | Yes | |
| backend | Yes | |
| warnings | No | |
| uncatalogued | No | Media models the API offers that the catalog does not know yet (usable by raw ID) |
| catalogVersion | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | The job uri returned by tile_image. | |
| tiles | Yes | The edited tiles. Tiles left out keep the underlying image. | |
| details | No | Up to 6 points to return as 100% crops for inspection. Default: where grid tiles meet, or each region's center. | |
| feather | No | Blend 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. | |
| colorMatch | No | Match each tile's broad exposure and color to the image (default true). Fine texture is never transferred. | |
| outputName | No | Optional base name for the stitched PNG. |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | Yes | |
| next | Yes | |
| pass | Yes | |
| tiles | Yes | |
| details | No | What each detail preview shows, in order |
| original | Yes | |
| warnings | No | |
| reference | Yes | |
| nativeLongEdge | No | About 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| grid | No | Cut 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. | |
| image | Yes | The 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. | |
| model | No | Image 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. | |
| padding | No | Context 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. | |
| regions | No | Refinement pass: up to 12 areas to re-render (faces, hands, text, materials), as fractions of the image. Omit for a full grid. | |
| longEdge | No | Long 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. | |
| original | No | First 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. | |
| imageSize | No | Size 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. | |
| outputName | No | Optional base name for the crops and the stitched result. Defaults to the original's name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | Pass it to stitch_tiles |
| cost | Yes | Estimated cost of editing every tile once (tile_image itself is free) |
| grid | No | Grid size used (grid mode): 1 is the whole image as one tile |
| mode | Yes | grid or regions |
| next | Yes | |
| pass | Yes | |
| image | Yes | Size of the tiled image |
| model | Yes | |
| tiles | Yes | |
| output | Yes | Size stitch_tiles will produce |
| prompt | Yes | Base 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. |
| planNote | No | Why this grid and imageSize were chosen, when picked automatically |
| warnings | No | |
| imageSize | Yes | |
| reference | No | First 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. |
| nativeLongEdge | No | About 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
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.
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.
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.
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.
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.
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.
19 tool updates
v1.1.0- Removed
animate_image - Removed
compose_images - Removed
download_video - Changed
edit_image18 fields changed- added
Input schema / properties / approvedCostUsdAdded value: +{ + "description": "Only needed above the confirmation threshold: the cost in USD the user approved.", + "type": "number" +} - added
Input schema / properties / aspectRatioAdded value: +{ + "description": "Change the aspect ratio (outpainting). Omit to keep the source ratio.", + "type": "string" +} - added
Input schema / properties / imageAdded value: +{ + "description": "The image to edit: file path, gemini-media:// URI from an earlier result, or data: URI.", + "type": "string" +} - removed
Input schema / properties / imagePathRemoved value: -{ - "description": "Path to the image to edit", - "type": "string" -} - added
Input schema / properties / imageSizeAdded value: +{ + "description": "Output size: 1K, 2K or 4K (512 only on the deprecated gemini-3.1-flash-image).", + "type": "string" +} - changed
Input schema / properties / model / descriptionPrevious value: -"Model tier: nb2 (default) or pro"New value: +"Model ID or alias. Defaults to the model that created the source image, else nb2." - added
Input schema / properties / outputNameAdded value: +{ + "description": "Optional base file name for the saved file. Defaults to the source name plus -edit.", + "type": "string" +} - changed
Input schema / properties / prompt / descriptionPrevious 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')." - added
Input schema / properties / referenceImagesAdded 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" + ] +} - changed
Input schema / requiredPrevious value: -[ - "prompt", - "imagePath" -]New value: +[ + "image", + "prompt" +] - added
Output schema / properties / costAdded 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" +} - removed
Output schema / properties / filePathRemoved value: -{ - "type": "string" -} - added
Output schema / properties / filesAdded 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" + ] +} - added
Output schema / properties / groundingAdded 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" + ] +} - removed
Output schema / properties / mimeTypeRemoved value: -{ - "type": "string" -} - added
Output schema / properties / textAdded value: +{ + "description": "Commentary the model returned alongside the image(s)", + "type": "string" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - changed
Output schema / requiredPrevious value: -[ - "filePath", - "model", - "mimeType" -]New value: +[ + "files", + "model", + "cost" +]
- Added
edit_video - Added
estimate_cost - Changed
extend_video21 fields changed- added
Input schema / properties / approvedCostUsdAdded value: +{ + "description": "Only needed above the confirmation threshold.", + "type": "number" +} - added
Input schema / properties / jobIdAdded value: +{ + "description": "Job handle of a completed generate_video or extend_video call (operation names from older versions also work).", + "type": "string" +} - removed
Input schema / properties / modelRemoved value: -{ - "description": "Model tier (must match original). Standard and Fast only, Lite does not support extension", - "type": "string" -} - added
Input schema / properties / negativePromptAdded value: +{ + "type": "string" +} - removed
Input schema / properties / operationIdRemoved value: -{ - "description": "Operation ID of the previous video generation", - "type": "string" -} - added
Input schema / properties / outputNameAdded value: +{ + "type": "string" +} - changed
Input schema / properties / prompt / descriptionPrevious 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." - added
Input schema / properties / seedAdded value: +{ + "description": "Vertex AI only.", + "type": [ + "null", + "integer" + ] +} - added
Input schema / properties / waitSecondsAdded value: +{ + "description": "Block up to this many seconds for the result (default 0).", + "type": "integer" +} - changed
Input schema / requiredPrevious value: -[ - "prompt", - "operationId" -]New value: +[ + "jobId", + "prompt" +] - added
Output schema / properties / costAdded 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" +} - added
Output schema / properties / elapsedSecondsAdded value: +{ + "type": "integer" +} - added
Output schema / properties / errorAdded value: +{ + "type": "string" +} - added
Output schema / properties / filesAdded 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" + ] +} - added
Output schema / properties / jobIdAdded value: +{ + "description": "Opaque handle; pass it to get_video, extend_video or edit_video", + "type": "string" +} - added
Output schema / properties / nextAdded value: +{ + "description": "Suggested next step", + "type": "string" +} - removed
Output schema / properties / operationIdRemoved value: -{ - "type": "string" -} - added
Output schema / properties / remoteExpiresAtAdded value: +{ + "description": "When Google deletes the server-side copy; extend before this time", + "type": [ + "null", + "string" + ] +} - added
Output schema / properties / stateAdded value: +{ + "description": "working, completed, failed or filtered", + "type": "string" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - changed
Output schema / requiredPrevious value: -[ - "operationId", - "model" -]New value: +[ + "jobId", + "state", + "model", + "elapsedSeconds", + "cost" +]
- Removed
generate_audio - Changed
generate_image18 fields changed- added
Input schema / properties / approvedCostUsdAdded value: +{ + "description": "Only needed when a call exceeds the configured confirmation threshold: the cost in USD the user approved.", + "type": "number" +} - changed
Input schema / properties / aspectRatio / descriptionPrevious 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." - added
Input schema / properties / countAdded value: +{ + "description": "Number of variations to generate in parallel (1-4, default 1). Each is billed.", + "type": "integer" +} - added
Input schema / properties / googleSearchAdded value: +{ + "description": "Ground the image in Google Search results (current events, real places, data for infographics).", + "type": "boolean" +} - added
Input schema / properties / imageSizeAdded value: +{ + "description": "Output size: 1K (default), 2K or 4K. Larger costs more. 512 only on the deprecated gemini-3.1-flash-image.", + "type": "string" +} - changed
Input schema / properties / model / descriptionPrevious 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." - added
Input schema / properties / outputNameAdded value: +{ + "description": "Optional base file name (without extension) for the saved file(s).", + "type": "string" +} - changed
Input schema / properties / prompt / descriptionPrevious 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." - added
Input schema / properties / referenceImagesAdded 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" + ] +} - removed
Input schema / properties / resolutionRemoved value: -{ - "description": "Output resolution (1K, 2K, 4K)", - "type": "string" -} - added
Output schema / properties / costAdded 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" +} - removed
Output schema / properties / filePathRemoved value: -{ - "type": "string" -} - added
Output schema / properties / filesAdded 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" + ] +} - added
Output schema / properties / groundingAdded 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" + ] +} - removed
Output schema / properties / mimeTypeRemoved value: -{ - "type": "string" -} - added
Output schema / properties / textAdded value: +{ + "description": "Commentary the model returned alongside the image(s)", + "type": "string" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - changed
Output schema / requiredPrevious value: -[ - "filePath", - "model", - "mimeType" -]New value: +[ + "files", + "model", + "cost" +]
- Changed
generate_music18 fields changed- added
Input schema / properties / approvedCostUsdAdded value: +{ + "description": "Only needed above the confirmation threshold.", + "type": "number" +} - added
Input schema / properties / bpmAdded value: +{ + "description": "Optional tempo hint in beats per minute.", + "type": "integer" +} - added
Input schema / properties / durationSecondsAdded value: +{ + "description": "Optional target length hint for full songs (clip is always 30s).", + "type": "integer" +} - added
Input schema / properties / formatAdded value: +{ + "description": "mp3 (default) or wav (full model only).", + "type": "string" +} - added
Input schema / properties / imagesAdded value: +{ + "description": "Optional images (up to 10) whose mood or scene should inspire the music.", + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - added
Input schema / properties / instrumentalAdded value: +{ + "description": "Ask for no vocals.", + "type": "boolean" +} - added
Input schema / properties / lyricsAdded value: +{ + "description": "Optional lyrics with section tags; they are sung in the language they are written in.", + "type": "string" +} - changed
Input schema / properties / model / descriptionPrevious 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." - added
Input schema / properties / outputNameAdded value: +{ + "description": "Optional base file name.", + "type": "string" +} - changed
Input schema / properties / prompt / descriptionPrevious 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." - added
Output schema / properties / costAdded 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" +} - added
Output schema / properties / durationSecondsAdded value: +{ + "type": "number" +} - added
Output schema / properties / fileAdded 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" +} - removed
Output schema / properties / filePathRemoved value: -{ - "type": "string" -} - added
Output schema / properties / lyrics / descriptionAdded value: +"Lyrics or song structure returned by the model" - removed
Output schema / properties / mimeTypeRemoved value: -{ - "type": "string" -} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - changed
Output schema / requiredPrevious value: -[ - "filePath", - "model", - "mimeType" -]New value: +[ + "file", + "model", + "cost" +]
- Added
generate_speech - Changed
generate_video27 fields changed- added
Input schema / properties / approvedCostUsdAdded value: +{ + "description": "Only needed above the confirmation threshold: the cost in USD the user approved.", + "type": "number" +} - changed
Input schema / properties / aspectRatio / descriptionPrevious value: -"Aspect ratio (16:9 or 9:16)"New value: +"16:9 (default) or 9:16" - removed
Input schema / properties / durationRemoved value: -{ - "description": "Clip duration in seconds (4, 6, or 8)", - "type": "integer" -} - added
Input schema / properties / durationSecondsAdded value: +{ + "description": "Clip length: Veo 4, 6 or 8 seconds; omni 3-10 seconds (default 8).", + "type": "integer" +} - added
Input schema / properties / generateAudioAdded value: +{ + "description": "Vertex AI only: set false for silent video at a lower price. The Gemini API always generates audio.", + "type": [ + "null", + "boolean" + ] +} - added
Input schema / properties / imageAdded value: +{ + "description": "Optional first frame (image-to-video): file path, gemini-media:// URI or data: URI.", + "type": "string" +} - added
Input schema / properties / lastFrameAdded value: +{ + "description": "Optional last frame; requires image. Veo interpolates between the two.", + "type": "string" +} - changed
Input schema / properties / model / descriptionPrevious 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." - added
Input schema / properties / negativePromptAdded value: +{ + "description": "What to avoid, as plain nouns (e.g. 'text overlays, blur'). For omni it is appended to the prompt.", + "type": "string" +} - added
Input schema / properties / outputNameAdded value: +{ + "description": "Optional base file name for the saved video.", + "type": "string" +} - added
Input schema / properties / personGenerationAdded 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" +} - changed
Input schema / properties / prompt / descriptionPrevious 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)." - added
Input schema / properties / referenceImagesAdded 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" + ] +} - changed
Input schema / properties / resolution / descriptionPrevious 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." - added
Input schema / properties / seedAdded value: +{ + "description": "Seed for more repeatable results (Vertex AI only; ignored on the Gemini API).", + "type": [ + "null", + "integer" + ] +} - added
Input schema / properties / waitSecondsAdded 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" +} - added
Output schema / properties / costAdded 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" +} - added
Output schema / properties / elapsedSecondsAdded value: +{ + "type": "integer" +} - added
Output schema / properties / errorAdded value: +{ + "type": "string" +} - added
Output schema / properties / filesAdded 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" + ] +} - added
Output schema / properties / jobIdAdded value: +{ + "description": "Opaque handle; pass it to get_video, extend_video or edit_video", + "type": "string" +} - added
Output schema / properties / nextAdded value: +{ + "description": "Suggested next step", + "type": "string" +} - removed
Output schema / properties / operationIdRemoved value: -{ - "type": "string" -} - added
Output schema / properties / remoteExpiresAtAdded value: +{ + "description": "When Google deletes the server-side copy; extend before this time", + "type": [ + "null", + "string" + ] +} - added
Output schema / properties / stateAdded value: +{ + "description": "working, completed, failed or filtered", + "type": "string" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - changed
Output schema / requiredPrevious value: -[ - "operationId", - "model" -]New value: +[ + "jobId", + "state", + "model", + "elapsedSeconds", + "cost" +]
- Changed
get_config18 fields changed- added
Output schema / properties / authModeAdded value: +{ + "type": "string" +} - added
Output schema / properties / backendReasonAdded value: +{ + "type": "string" +} - added
Output schema / properties / budgetAdded value: +{ + "additionalProperties": false, + "properties": { + "confirmAboveUsd": { + "type": "number" + }, + "dailyUsd": { + "type": "number" + }, + "monthlyUsd": { + "type": "number" + }, + "sessionUsd": { + "type": "number" + } + }, + "required": [ + "sessionUsd", + "dailyUsd", + "monthlyUsd", + "confirmAboveUsd" + ], + "type": "object" +} - added
Output schema / properties / catalogFileAdded value: +{ + "type": "string" +} - added
Output schema / properties / catalogVersionAdded value: +{ + "type": "string" +} - added
Output schema / properties / configFileAdded value: +{ + "type": "string" +} - added
Output schema / properties / defaultsAdded value: +{ + "additionalProperties": true, + "type": "object" +} - added
Output schema / properties / httpAddrAdded value: +{ + "description": "Address the HTTP transport listens on", + "type": "string" +} - added
Output schema / properties / inlinePreviewsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / inputPolicyAdded value: +{ + "type": "string" +} - added
Output schema / properties / locationAdded value: +{ + "type": "string" +} - added
Output schema / properties / projectAdded value: +{ + "type": "string" +} - added
Output schema / properties / settingSourcesAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / stateDirAdded value: +{ + "type": "string" +} - added
Output schema / properties / transportAdded value: +{ + "type": "string" +} - added
Output schema / properties / versionAdded value: +{ + "type": "string" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - changed
Output schema / requiredPrevious value: -[ - "backend", - "outputDir" -]New value: +[ + "version", + "backend", + "authMode", + "backendReason", + "transport", + "outputDir", + "stateDir", + "catalogVersion", + "defaults", + "budget", + "inputPolicy", + "inlinePreviews" +]
- Added
get_usage - Added
get_video - Changed
list_models23 fields changed- added
Input schema / propertiesAdded 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" + } +} - added
Output schema / properties / backendAdded value: +{ + "type": "string" +} - added
Output schema / properties / catalogVersionAdded value: +{ + "type": "string" +} - added
Output schema / properties / models / items / properties / aliasesAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - removed
Output schema / properties / models / items / properties / aspectRatiosRemoved value: -{ - "items": { - "type": "string" - }, - "type": [ - "null", - "array" - ] -} - added
Output schema / properties / models / items / properties / availableAdded value: +{ + "description": "From live check: whether the API lists this model for your key", + "type": [ + "null", + "boolean" + ] +} - added
Output schema / properties / models / items / properties / capabilitiesAdded 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" + ] +} - added
Output schema / properties / models / items / properties / defaultAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / models / items / properties / notesAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / models / items / properties / onBackendAdded value: +{ + "description": "Offered on the active backend", + "type": "boolean" +} - added
Output schema / properties / models / items / properties / priceAdded value: +{ + "type": "string" +} - removed
Output schema / properties / models / items / properties / pricePerSecRemoved value: -{ - "type": "string" -} - added
Output schema / properties / models / items / properties / replacementAdded value: +{ + "type": "string" +} - removed
Output schema / properties / models / items / properties / resolutionsRemoved value: -{ - "items": { - "type": "string" - }, - "type": [ - "null", - "array" - ] -} - added
Output schema / properties / models / items / properties / shutdownAdded value: +{ + "type": "string" +} - added
Output schema / properties / models / items / properties / statusAdded value: +{ + "type": "string" +} - added
Output schema / properties / models / items / properties / summaryAdded value: +{ + "type": "string" +} - removed
Output schema / properties / models / items / properties / tierRemoved value: -{ - "type": "string" -} - added
Output schema / properties / models / items / properties / titleAdded value: +{ + "type": "string" +} - changed
Output schema / properties / models / items / requiredPrevious value: -[ - "id", - "tier", - "mediaType", - "resolutions", - "aspectRatios" -]New value: +[ + "id", + "mediaType", + "status", + "price", + "onBackend" +] - added
Output schema / properties / uncataloguedAdded value: +{ + "description": "Media models the API offers that the catalog does not know yet (usable by raw ID)", + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - changed
Output schema / requiredPrevious value: -[ - "models" -]New value: +[ + "catalogVersion", + "backend", + "models" +]
- Added
stitch_tiles - Added
tile_image - Removed
video_status
12 tool updates
- First observed
animate_image - First observed
compose_images - First observed
download_video - First observed
edit_image - First observed
extend_video - First observed
generate_audio - First observed
generate_image - First observed
generate_music - First observed
generate_video - First observed
get_config - First observed
list_models - First observed
video_status
TDQS
Scored across 14 tools
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.
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.
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.
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
Related MCP Connectors
MCP server for Google Veo AI video generation
AI image, video, voice and music generation over MCP, routed to Veo 3.1, Seedance 2.5 and more.
MCP server for Qwen Image 3 AI image generation
MCP server for Hailuo (MiniMax) AI video generation
Related MCP Servers
- AlicenseBqualityCmaintenanceAI 3D model generation and post-processing MCP server — text/image/multiview-to-3D via Tripo, retopology, format conversion (GLB/FBX/OBJ/STL/USDZ), and stylization. Single Go binary, 10 tools.295Apache 2.0
- AlicenseNot gradedqualityAmaintenanceMCP server for generating images and videos using Google Gemini and VEO models, with support for multiple AI models and credential modes.60 PyPI1Apache 2.0
- AlicenseAqualityFmaintenanceProduction-grade MCP server for image and video understanding and generation across Gemini, OpenAI, and Grok.54Apache 2.0
- FlicenseBqualityDmaintenanceA production-ready MCP server that enables Claude and other LLMs to generate images and videos using Google's Gemini AI models (Gemini 2.0 Flash and Veo 2.0).32-