Skip to main content
Glama
farukcan
by farukcan

Попросите своего агента нарисовать картинку — и он получит путь к файлу, а не простыню base64. Сервер генерирует изобржение с помощью Gemini или OpenAI, записывает его на диск и возвращает только абсолютный путь. Ваше контекстное окно остаётся чистым, а файл тут же доступен агенту — открыть, переместить или передать другому инструменту.

Возможности

  • Один инструмент, без лишних церемоний. generate_image(prompt, images, aspect_ratio) — вот и весь API.

  • Пути, а не пеяды. Возвращает абсолютный путь к файлу, так что PNG на 1,5 МБ обходится вам в ~60 токенов вместо ~2 милллионов.

  • Два провайдера с автовыбором. Укажите тот API-ключ, который у вас есть. Заданы оба? Решает IMAGE_PROVIDER.

  • Изобржение-к-изобржению. Передайте до 4 референсных изобржений, чтобы перестилизовать, отредактировать или объединить их.

  • Гибкие входные данные. Референс может быть локальным путём, URL вида http(s), URI вида data: или просто base64 — сервер сам разберётся.

  • Оба транспорта. stdio для локальных клиентов, потоковый HTTP (с привязкой к localhost) — когда нужен порт.

  • Честные ошибки. Никаких повторов, скрывающих неверный ключ, и никакого тихого переключения провайдера. Когда API отвечает 429, вы видите 429.

  • Достаточно мал, чтобы прочитать. ~540 строк исходного кода, ни один файл не больше 100 строк, строгая типизация повсюду.

Related MCP server: VisionToolMCP

Предварительные требования

Требование

Примечания

Python 3.11+

3.12 — версия, на которой выполняются локальные проверки, эквивалентные CI

uv

curl -LsSf https://astral.sh/uv/install.sh | sh

API-ключ

Google Gemini или OpenAI — хотя бы один

Примечание об оплате. Модели изображений не входят в бесплатный тариф ни у одного из провайдеров. Ключ Gemini без включённого биллинга возвращает 429 ... limit: 0 для каждой модели изображений.

Быстрый старт

git clone https://github.com/farukcan/image-generation-mcp.git
cd image-generation-mcp
uv sync

cp .env.example .env      # add OPENAI_API_KEY or GEMINI_API_KEY
uv run pytest -m smoke    # generates a real image into out/

Эта последняя команда — самый быстрый способ убедиться, что ключ работает по полному циклу: она печатает путь к только что созданному изображению.

Подключение к вашему агенту

Claude Code

claude mcp add image-generation \
  -e OPENAI_API_KEY=sk-... \
  -- uvx --from git+https://github.com/farukcan/image-generation-mcp image-generation-mcp

uvx при первом запуске загружает, собирает и кеширует пакет — заранее ничего устанавливать не нужно и вручную обновлять тоже.

Предпочитаете локальную копию, которую можно редактировать? Укажите вместо этого каталог:

claude mcp add image-generation \
  -e OPENAI_API_KEY=sk-... \
  -- uv run --directory /absolute/path/to/image-generation-mcp image-generation-mcp

Добавьте -s user, чтобы сделать его доступным во всех проектах, а не только в этом. Проверьте командой claude mcp list, а удалите — claude mcp remove image-generation.

Gemini CLI

Те же флаги, та же форма:

gemini mcp add image-generation \
  -e OPENAI_API_KEY=sk-... \
  -- uvx --from git+https://github.com/farukcan/image-generation-mcp image-generation-mcp

Cursor, Windsurf, Claude Desktop и всё остальное

Эти клиенты читают JSON-файл конфигурации (.cursor/mcp.json, claude_desktop_config.json, …). Запись везде одинаковая:

{
  "mcpServers": {
    "image-generation": {
      "command": "uvx",
      "args": [
        "--from", "git+https://github.com/farukcan/image-generation-mcp",
        "image-generation-mcp"
      ],
      "env": {
        "OPENAI_API_KEY": "sk-...",
        "OUT_DIR": "/absolute/path/where/images/should/land"
      }
    }
  }
}

Задайте OUT_DIR явно для GUI-клиентов — они часто запускаются с рабочей директорией, которую вы не ожидали, и out/ оказался бы там.

Как HTTP-сервис

uv run image-generation-mcp --transport http --port 8000

Сервер отдаёт endpoint потокового HTTP на http://127.0.0.1:8000/mcp. Он привязан только к loopback и не имеет аутентификации, поэтому перед публикацией поместите его за прокси.

Инструмент

generate_image(prompt: str, images: list[str] | None = None, aspect_ratio: str = "1:1") -> str

Параметр

Описание

prompt

Что должно быть на изображении.

images

До 4 референсных изображений. Каждое — это локальный путь к файлу, URL вида http(s) (таймаут 30 с, потоковая передача с обрывом после 20 МБ), URI вида data: или просто base64. Существующий файл всегда имеет приоритет; в противном случае строка, похожая на base64, декодируется как base64.

aspect_ratio

1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9.

Возвращает абсолютный путь к записанному файлу, например /path/to/out/20260827-172746-c9b3.png. Имена имеют формат YYYYmmdd-HHMMSS-xxxx, так что результаты сортируются по времени и никогда не конфликтуют.

О соотношениях сторон: Gemini поддерживает все десять. OpenAI принимает только три размера, поэтому соотношения сводятся к ближайшему из 1024x1024, 1536x1024 или 1024x1536 — запрос 16:9 там даст вам 3:2.

Конфигурация

Каждая настройка — это переменная окружения. Файл .env в рабочей директории (или в любом родительском каталоге) загружается как запасной вариант; настоящие переменные окружения всегда имеют приоритет.

Переменная

По умолчанию

Назначение

GEMINI_API_KEY

Включает провайдера Gemini

OPENAI_API_KEY

Включает провайдера OpenAI

IMAGE_PROVIDER

не задано

Принудительно выбирает gemini или openai. Если не задано — сначала Gemini, затем OpenAI

GEMINI_IMAGE_MODEL

gemini-3.1-flash-image

Также: gemini-3-pro-image, gemini-3.1-flash-lite-image

OPENAI_IMAGE_MODEL

gpt-image-2

Также: gpt-image-1.5, gpt-image-1, gpt-image-1-mini

OUT_DIR

<cwd>/out

Куда записываются созданные изображения

MCP_TRANSPORT

stdio

stdio или http; --transport переопределяет его

MCP_PORT

8000

HTTP-порт; --port переопределяет его

Запустите сервер вообще без API-ключа — и первый же запрос завершится с громкой ошибкой, называющей переменные, которые сервер искал.

Как это работает

flowchart LR
    A([MCP client]) -->|generate_image| B[server.py]
    B --> C[aspect.py<br/>validate ratio]
    B --> D[sources.py + download.py<br/>path / URL / base64 → bytes]
    B --> E{"registry.py<br/>which provider?"}
    E -->|GEMINI_API_KEY| F[gemini_provider.py<br/>Interactions API]
    E -->|OPENAI_API_KEY| G[openai_provider.py<br/>generate / edit]
    F --> H[output.py<br/>write into OUT_DIR]
    G --> H
    H -->|absolute path| A

Каждый модуль делает одну вещь и остаётся в пределах 100 строк. Провайдеры кешируются для каждой разрешённой конфигурации, поэтому SDK-клиент и его пул соединений переиспользуются между вызовами, а не пересоздаются для каждого запроса.

Провайдеры

Gemini

OpenAI

API

Interactions (client.aio.interactions.create)

Images (images.generate / images.edit)

Минимальная версия SDK

google-genai >= 2.3.0

openai >= 3.0.0

Референсные изображения

Отправляются инлайн в виде base64-частей

Загружаются как multipart-файлы

Формат вывода

Что вернёт модель — расширение следует за ним

Всегда PNG (output_format="png")

Два намеренных нюанса, о которых стоит знать:

  • У Gemini параметр response_format для изображений принимает только image/jpeg как явный MIME-тип, поэтому сервер не запрашивает его и называет файл по тому, что вернулось.

  • input_fidelity никогда не отправляется в OpenAI — gpt-image-2 отвергает его с кодом 400 и сам применяет высокую детализацию.

Разработка

uv run ruff check . && uv run ruff format --check .
uv run mypy
uv run pytest              # unit tests, all providers mocked
uv run pytest -m smoke -s  # real API calls; costs money, prints the paths

Смоук-тесты отключены по умолчанию, чтобы обычный запуск pytest никогда не тратил деньги. test_edits_a_real_image стоит две генерации, потому что создаёт собственное референсное изображение.

Логотип и скриншот тоже создаются генерацией — редактируйте скрипты, а не SVG:

uv run python media/generate_logo.py
uv run python media/generate_screenshot.py

Ограничение в 100 строк на файл — это осознанное проектное решение, а не случайность: благодаря ему каждый модуль можно просмотреть на одном экране. Лучше разбивать, чем растягивать.

Устранение неполадок

Симптом

Причина

429 ... limit: 0

Модель не входит в бесплатный тариф вашего плана. Включите биллинг в проекте провайдера.

RuntimeError: No API key configured

Не задан ни один ключ, и .env не найден ни в рабочей директории, ни выше по дереву каталогов.

Изображения появляются не там, где ожидалось

OUT_DIR не задан, и клиент запустил сервер из другой директории. Задайте его явно.

Unsupported aspect_ratio

Принимаются только десять указанных соотношений; в сообщении ошибки они перечислены.

reference images must be one of ...

OpenAI принимает только PNG, JPEG или WebP в качестве референсов.

Лицензия

MIT © Ömer Faruk Can

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all related MCP servers

Related MCP Connectors

  • OCR, transcription, file extraction, and image generation for AI agents via MCP.

  • Generate on-brand images from your AI agent: design, edit, and render templates over MCP.

  • Generate images with any major model — one API key, one prepaid balance, one MCP.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/farukcan/image-generation-mcp'

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