gemini-image-mcp
gemini-image-mcp
A standalone, user-scoped Model Context Protocol server that lets Claude Code generate and edit images with Google's Gemini image models (Nano Banana / Nano Banana Pro) and Imagen 4 — running on Vertex AI with Application Default Credentials (ADC). No API key, no JSON key file.
Default model:
nano-banana= Gemini 2.5 Flash Image (GA).Also exposed:
nano-banana-pro(Gemini 3 Pro Image, preview) and theimagen-4*family.Transport: stdio (local) or streamable-http (remote), via the official Python MCP SDK (FastMCP).
Auth: Vertex AI + ADC only. You bring your own GCP project.
Quick start (one command, no clone)
uvx fetches and runs the server straight from GitHub — nothing to clone or install.
Register it with Claude Code at user scope in a single command:
claude mcp add gemini-image -s user \
-e GOOGLE_CLOUD_PROJECT=your-gcp-project-id \
-- uvx --from git+https://github.com/someshwarpatil/gemini-image-mcp.git gemini-image-mcpThen authenticate once with ADC and restart Claude Code:
gcloud auth application-default loginPrereqs: Python 3.12 + uv, the
gcloud CLI, and a GCP project with the
Vertex AI API enabled. Verify with claude mcp list / claude mcp get gemini-image.
How it works
The server runs as its own process (Claude Code spawns it over stdio). Because it is a
separate process, it cannot see the client's per-session scratchpad — so every tool takes
an explicit output_dir. The full-resolution PNG is always saved to disk and its
absolute path is always returned. A small downscaled preview image is returned only
when return_image=True, to protect the client's token budget (a full-res MCP image can cost
~15-25k tokens).
Setup from a clone (for development)
git clone https://github.com/someshwarpatil/gemini-image-mcp.git
cd gemini-image-mcp
# One command: sync deps + check ADC + register with Claude Code.
GOOGLE_CLOUD_PROJECT=your-gcp-project-id ./scripts/setup.shscripts/setup.sh runs uv sync, checks ADC, and registers the server at user scope
(idempotent — safe to re-run). Or do it manually:
uv sync
gcloud auth application-default login # one-time ADC; no API key, no JSON key file
export GOOGLE_CLOUD_PROJECT=your-gcp-project-idPrefer a file over shell exports? Copy .env.example → .env and fill in your values
(.env is gitignored).
Environment
Variable | Default | Purpose |
| (auto-detected from ADC / gcloud) | GCP project serving the Vertex image models. |
|
| Vertex location for the Gemini models. Gemini image models are global-only on Vertex — leave as |
|
| Vertex location for the Imagen models (Imagen is not served on |
| (unset) | Default dir for saved PNGs when a call omits |
|
| stderr log level for the server ( |
|
|
|
| (unset) | Private bucket for |
|
| Signed-URL lifetime (days) for |
output_dir resolution order: explicit tool argument → GEMINI_IMAGE_OUTPUT_DIR → process CWD.
Models
Pass the friendly alias — never the raw model id.
Alias | Vertex model id | Family | Edit? | Location | Notes |
|
| gemini | yes |
| Default. GA. text→image + edit/fusion. |
|
| gemini | yes |
| Preview on Vertex; up to 14 ref images, up to 4K. May 404 if the project isn't gated. |
|
| imagen | no |
| GA standard. text→image only. Deprecation risk (~2026-06-30). |
|
| imagen | no |
| GA fast/low-cost. text→image only. |
|
| imagen | no |
| GA highest quality. |
Gemini aspect ratios: 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9.
Imagen aspect ratios: 1:1, 3:4, 4:3, 9:16, 16:9.
The Gemini models are the durable path. The
imagen-4*aliases are best-effort: Imagen 4 had an announced EOL around 2026-06-30 and may fail at runtime — the underlying Vertex error is surfaced verbatim.
Tools
generate_image(prompt, model="nano-banana", aspect_ratio="1:1", n=1, output_dir=None, return_image=True)Text → image. For Gemini,n>1loops one image per call; Imagen uses native batching (imagen-4-ultrais capped at 1).nis capped at 8 per call — each image is a separately billed generation.edit_image(image_paths, prompt, model="nano-banana", output_dir=None, return_image=True)Image(s) + instruction → image. One input = edit, two or more = fusion. Gemini aliases only —imagen-4*is rejected with a clear error.list_models()— the alias table + notes (cheap, offline).
Register with Claude Code (from a clone)
The Quick start uvx command needs no clone. If you've
cloned the repo instead, use the tracked script — it derives the repo path automatically and
reads your project from the environment. ~/.claude.json is not committed.
GOOGLE_CLOUD_PROJECT=your-gcp-project-id bash scripts/register.shEquivalent raw command:
claude mcp add gemini-image \
-e GOOGLE_CLOUD_PROJECT=your-gcp-project-id \
-e GOOGLE_CLOUD_LOCATION=global \
--scope user \
-- uv --directory /path/to/gemini-image-mcp run gemini-image-mcp--scope user is placed after the -e flags and immediately before the name (the
CLI rejects a name right after -e). -t stdio is implied by the -- <command> form.
Verify with claude mcp list and claude mcp get gemini-image.
Remote deployment (Cloud Run / AWS / your VM)
Run the same server over streamable-http so the Claude apps (web / desktop / mobile)
can use it as a custom connector and generate images directly in chat. Because a remote client
can't read the server's disk, set the return mode to send the image back: gcs uploads
each image to a private bucket and returns a signed URL (the reliable choice — the Claude
apps don't render inline MCP image blocks), or inline returns the raw bytes for clients that
do. The Cloud Run deploy below uses gcs.
Auth reality: claude.ai custom connectors send no static bearer token and must reach a
public URL. So the deployment is public, guarded by a secret path: the MCP endpoint
lives at /<secret>/mcp and the whole URL is the credential. Keep it secret; rotate it (new
secret + redeploy) if it leaks. The service scales to zero and caps max-instances to bound
cost. For stronger auth, front it with OAuth 2.1 or an API gateway.
Any container host (Docker)
docker build -t gemini-image-mcp .
docker run -p 8080:8080 \
-e GOOGLE_CLOUD_PROJECT=your-gcp-project-id \
-e GEMINI_IMAGE_RETURN_MODE=inline \
-e MCP_PATH_SECRET="$(openssl rand -hex 24)" \
gemini-image-mcp
# endpoint: http://localhost:8080/<secret>/mcpOn AWS / your own VM, front it with TLS (connectors require https) via your load balancer or
reverse proxy, and supply ADC through the platform's workload identity or a service account —
never a committed key file.
Google Cloud Run (scripted)
GOOGLE_CLOUD_PROJECT=your-gcp-project-id ./scripts/deploy_cloudrun.shThe script enables the required APIs, mints a secret path token in Secret Manager, grants the
Cloud Run runtime service account roles/aiplatform.user (Vertex via ADC — no key files) plus
secret access, builds from source, and deploys public + scale-to-zero + max 2 instances.
It prints the connector URL (https://<service>/<secret>/mcp). On Cloud Run, ADC is the
service account automatically.
Add it as a Claude connector
claude.ai (or the Claude desktop app) → Settings → Connectors → Add custom connector.
Paste the connector URL (
https://<service>/<secret>/mcp); leave auth as none.Add, then in a chat ask Claude to "generate an image of …" — it calls
generate_imageand returns a viewable signed-URL link to the picture. Works on web, desktop, and mobile.
Verify a deployment
uv run python scripts/smoke_remote.py "https://<service>/<secret>/mcp" # list tools
uv run python scripts/smoke_remote.py "https://<service>/<secret>/mcp" --generate "a red panda" # one imageNotes & caveats
SynthID watermark: all Gemini image output carries an invisible SynthID watermark. This is not optional.
Data residency:
globaldoes not satisfy data-residency requirements and has separate quotas from regional endpoints. Fine for most personal/dev use.Previews may not render inline in every Claude Code build and can be token-expensive — which is exactly why the full-res file is always on disk and the path is always returned.
stdio vs remote: the stdio server (Quick start) targets Claude Code (terminal + IDE) and, via its own config, the Claude desktop app. For the Claude apps (web/desktop/mobile) and generating images in chat, deploy the HTTP server — see Remote deployment.
License
MIT.