image-gen-mcp
image-gen-mcp
MCP-сервер, который генерирует изображения с помощью нативных моделей генерации изображений Google Gemini («Nano Banana»), предоставляемых через Streamable HTTP.
Один инструмент — generate_image. Никакого состояния, никакой собственной аутентификации: в продакшене он работает как бэкенд за mcp-oauth-proxy, развёртываемый через cloudrun-mcp-deployment.
В DESIGN.md объясняется, почему он устроен именно так; в этом файле — как запустить его.
Быстрый старт (локально, токен)
uv sync
export GEMINI_API_KEY="…" # from Google AI Studio
export IMAGE_MCP_TOKEN="$(openssl rand -base64 32)"
uv run python -m image_gen_mcpНаправьте клиент на http://127.0.0.1:8080/mcp с заголовком Authorization: Bearer $IMAGE_MCP_TOKEN. Для Claude Code:
claude mcp add --transport http image-gen http://127.0.0.1:8080/mcp \
--header "Authorization: Bearer $IMAGE_MCP_TOKEN"Related MCP server: Imagen MCP Server
Инструмент
generate_image(prompt, aspect_ratio="1:1", image_size="1K", model=None)Параметр | Значения |
| произвольный текст, до |
|
|
|
|
| необязательный; должен быть в |
Изображения размером не больше IMAGE_MCP_INLINE_MAX_BYTES (по умолчанию 1.5 МБ) возвращаются инлайн и отображаются в чате. Более крупные загружаются в Cloud Storage и возвращаются по подписанному URL. Структурированный вывод всегда сообщает реальные размеры в пикселях, использованную модель и выбранный способ доставки.
Поддержка моделей / разрешений
Модель | 1K | 2K | 4K |
| ✅ | — | — |
| ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ |
Неподдерживаемые комбинации отклоняются на границе инструмента за миллисекунды, с сообщением о том, что поддерживается, — а не после 30-секундного обмена запросами и ответами.
Конфигурация
Всё берётся из окружения. Полный аннотированный список — в .env.example; основное:
Переменная | Обязательна | Назначение |
| да | ключ Google AI Studio |
| если не за прокси | статический bearer-токен |
| модель по умолчанию | |
| модели, которые может выбрать вызывающий | |
| за прокси | брать личность из |
| опциональное сужение списка разрешённых прокси | |
| для 2K/4K | bucket для изображений большего размера |
Сервер откажется запускаться, а не работать с некорректными настройками: отсутствие API-ключа и отсутствие аутентификационной границы вообще (ни статического токена, ни прокси-режима) являются ошибками запуска.
Аутентификация
Есть два режима, и без любого поля сервер не запускается.
За прокси (продакшн). Установите IMAGE_MCP_TRUST_PROXY_HEADERS=1. Прокси аутентифицирует пользователя через Google, применяет свой allowlist, снимает заголовок Authorization клиента и передаёт личность в заголовках X-Auth-Email / X-Auth-Subject / X-Auth-Scope. Сервер читает эти заголовки и не требует собственного токена — запрос без X-Auth-Email получает 401.
Доверять заголовкам безопасно только потому, что до процесса больше никто не может достучаться: в многоконтейнерной схеме Cloud Run бэкенд не объявляет входящий порт, поэтому открыть сокет к нему могут только прокси в том же экземпляре и стартовый пробер. Никогда не включайте это на маршрутизируемом порту.
ALLOWED_EMAILS здесь необязателен и сужает allowlist прокси — это полезно, когда прокси допускает целый домен, а генерация изображений должна тратить средства только на нескольких человека. Если не установлено — «кто вошёл через прокси».
Токен (локально, Claude Code). Оставьте IMAGE_MCP_TRUST_PROXY_HEADERS незаданным и установите IMAGE_MCP_TOKEN. Вызывающие отправляют Authorization: Bearer <token>; заголовки X-Auth-* полностью игнорируются, поскольку без прокси это просто недостоверные данные.
Сервер не реализует терминацию OAuth и не имеет эндпоинтов /authorize, /token или /register. Установка GOOGLE_OAUTH_CLIENT_ID или _SECRET — ошибка запуска, а не тихий no-op: эти параметры должны быть на прокси.
Сборка образа
.github/workflows/build.yml запускает тесты, собирает образ и публикует его в GitHub Container Registry. Деплой он не выполняет — развёртывание делает отдельный workflow или репозитория.
Событие | Тест | Сборка | Публикация |
pull request | ✅ | ✅ | — |
push в | ✅ | ✅ |
|
тег | ✅ | ✅ |
|
Публикуется как ghcr.io/ramzpat/image-gen-mcp. Настраивать ничего не нужно: workflow аутентифицируется встроенным GITHUB_TOKEN.
Использование в workflow деплоя
Деплой по digest, а не по тегу. Pull-through cache перед изменяемым тегом типа :latest с радостью выдаст старый образ; digest не может появиться на свет. Каждое выполнение печатает digest в возившую job summary, а workflow вызывавший — если нужно собрать и задеплоить в едином конвейере:
jobs:
build:
uses: ramzpat/image-gen-mcp/.github/workflows/build.yml@main
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- run: echo "deploying ${{ needs.build.outputs.image }}@${{ needs.build.outputs.digest }}"Из отдельного репозитория определите digest и задеплой, в шаге:
DIGEST=$(docker buildx imagetools inspect \
ghcr.io/ramzpat/image-gen-mcp:latest --format '{{.Manifest.Digest}}')Пакет GHCR по умолчанию приватный. Задание деплоя в другом репозитории требует либо PAT с правами read:packages, либо перевода пакета в публичный в настройках пакета GitHub.
Деплой
Развёрнут с помощью cloudrun-mcp-deployment (.github/workflows/deploy-image-gen-mcp.yml), которая запускает этот образ как контейнер backend многоконтейнерного сервиса Cloud Run с mcp-oauth-proxy перед ним. Там находятся проект GCP, регион, allowlist и секреты; здесь только публикация.
Что эта деплой задаёт в этом контейнере:
|
|
|
|
| из GitHub Environment secret этого сервиса |
entrypoint |
|
HOST=0.0.0.0 вместо loopback — это требование, а не утечка: стартовый пробер Cloud Run работает но сетевом неймспейсе контейнера и не может достучаться до socket на loopback. Входящих трафик получает только контейнер, объявивший --port (прокси), поэтому backend остаётся недоступным извне экземпляра.
Cloud Storage для 2K/4K
gcloud storage buckets create gs://BUCKET --uniform-bucket-level-access
gcloud storage buckets update gs://BUCKET \
--lifecycle-file=<(echo '{"rule":[{"action":{"type":"Delete"},"condition":{"age":30}}]}')
# The runtime service account signs URLs through the IAM Credentials API,
# because it has no private key file. It needs this role *on itself*:
gcloud iam service-accounts add-iam-policy-binding RUNTIME_SA \
--member="serviceAccount:RUNTIME_SA" --role=roles/iam.serviceAccountTokenCreator
gcloud storage buckets add-iam-policy-binding gs://BUCKET \
--member="serviceAccount:RUNTIME_SA" --role=roles/storage.objectAdminВероятно, чаще всего подписанные URL являются сломанными из-за того, что не добавление биннинга serviceAccountTokenCreator — это типичнейшая причина.
Тесты
uv run pytest -q57 тестов: стартовые проверки, разрешение идентичности в обеих формах (заголовки прокси, статический токен, и каждая форма игнорирует другой атрибут), валидация инструмента и доставка, а также сквозные дымовые тесты, прогоняющие настоящий MCP-клиент по настоящему HTTP к uvicorn — в токен-режиме и в продакшн-форме с прокси.
Стоимость
Каждый разрешённый (allowlisted) пользователь использует один общий API-ключ. Регуляторы в порядке реального эффекта: --max-instances, IMAGE_MCP_MAX_CONCURRENCY, предупреждение о бюджете GCP и IMAGE_MCP_RATE_PER_HOUR. Предел дедупликации считается на каждый instance, поэтому фактический потолок — IMAGE_MCP_RATE_PER_HOUR × --max-instances.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables text-to-image generation, image editing, and multi-image composition using Google's Gemini 2.5 Flash Image API. Supports flexible aspect ratios and character consistency across generations.1
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to generate high-quality images using Google's Gemini and Imagen models with support for multiple aspect ratios, dynamic model selection, and direct file saving capabilities.MIT
- AlicenseNot gradedqualityNot gradedmaintenanceEnables image generation using Google's Gemini 2 API with customizable parameters like aspect ratio, number of samples, and person generation settings.189
- AlicenseNot gradedqualityBmaintenanceGenerates images from text prompts using Google's Gemini AI models with customizable aspect ratios and resolutions up to 4K, automatically saving images locally.332MIT
Related MCP Connectors
Generate images with any major model — one API key, one prepaid balance, one MCP.
Generate images, video & speech with Nano Banana, Veo, Omni and Gemini TTS. Pay as you go.
Generate logos, social posts, app screenshots, comic panels & visual-novel assets from prompts.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ramzpat/image-gen-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server