● LIVE· № 001 · SANITIZE ВСЁ, ЧТО УХОДИТ В GIT: ЧИСТКА ПУБЛИЧНЫХ РЕПО ОТ УТЕЧЕК ИДЕНТИЧНОСТИ · 2026.05.11· № 002 · IMAGEGEN-MCP: СВОЙ MCP-СЕРВЕР ДЛЯ ОБЛОЖЕК БЛОГА · 2026.05.11· № 003 · SMART PASTE: ЧИЩУ МУСОР ИЗ ТЕРМИНАЛА ПЕРЕД ВСТАВКОЙ ОДНИМ ХОТКЕЕМ · 2026.05.10· № 004 · CLAUDE CODE TEAM TELEMETRY: ЦЕНТРАЛИЗОВАННАЯ СТАТИСТИКА ПО КОМАНДЕ · 2026.05.07· № 005 · ГАЙД ДЛЯ НОВИЧКОВ: КАК ВКАТЫВАТЬСЯ В CLAUDE CODE · 2026.05.06· 11 СТАТЕЙ · 0 ЧЕРНОВИКОВ
RU / EN
·5 МИН

imagegen-mcp: свой MCP-сервер для обложек блога

Картинку на обложку поста раньше я генерил через curl + jq и руками клал в правильное место. Теперь это один tool-call внутри Claude Code: prompt, размер, путь — done. Маленький TS-сервер, public на GitHub, провайдер-агностик.

Боль

Каждый блог-пост у меня теперь идёт с editorial-обложкой — cartoon, 16:7, серия robot-vacuum desk-scene. До этого MCP флоу выглядел так:

  1. Открываешь другой инструмент: ChatGPT с image-генерацией, Midjourney через Discord, web-DALL·E, или какой-нибудь Leonardo. Каждый со своим UI.
  2. Пишешь промпт с нуля. Каждый раз заново вспоминаешь: какой именно стиль был у прошлой обложки? Cartoon с какими акцентами? Swiss-cartoon или просто flat? Какой персонаж? — нет ни истории, ни шаблона, который можно подцепить.
  3. Жмёшь генерацию. Хочется варианты — генеришь несколько. Что-то нравится — скачиваешь PNG из браузера.
  4. Идёшь в Finder, перетаскиваешь файл в нужную папку проекта (apps/blog/public/assets/posts/<slug>/). Или в Claude Code как attachment кидаешь — и потом просишь: "вот картинка, оформи как обложку".
  5. Claude в чате её копирует, обновляет frontmatter, кропит до 16:7 — если у тебя есть sips или ImageMagick локально. Если нет — ещё один поход в другой инструмент.

Получается переключение контекста между двумя-тремя приложениями ради одной картинки. Плюс главное — стиль каждой обложки приходится придумывать заново, потому что между сессиями ChatGPT/Midjourney не помнит, что в твоём блоге cartoon-серия с роботом-пылесосом и красной плашкой снизу. Каждый раз ты — единственная "память" этого style language-а.

Готового MCP-сервера, который бы работал прямо из Claude Code чата (без UI-переключения и ручного transfer-а файлов), при этом:

  • generate + edit + crop в одном пакете,
  • провайдер-агностик (хочу gpt-image-1.5 на OpenAI, sd3 на Stability, что-нибудь на Replicate когда будет настроение),
  • не хардкодит enum моделей (потому что gpt-image-1 устарел, gpt-image-1.5 существует, какие-нибудь gpt-image-2 появятся завтра),

— в community не нашёл. Существующие либо OpenAI-only с устаревшим enum, либо без editing, либо без crop. Написал свой.

Что отдал в public

imagegen-mcp — github.com/acrossoffwest/imagegen-mcp. MIT, TS + @modelcontextprotocol/sdk. Four tools:

  • generate_image — text-to-image. Model passes through as string, без enum-хардкода.
  • edit_image — image edit / inpaint. Где провайдер не поддерживает — бросает not_supported.
  • list_image_models — query /v1/models (или известный список), фильтр на image-capable.
  • crop_image — sharp-based ресайз. cover / contain / fill modes, любой gravity.

Провайдеры из коробки:

  • OpenAI native (gpt-image-1.5, dall-e-3, dall-e-2)
  • OpenAI-compatible через custom baseUrl — для locally-hosted backend-ов
  • Stability AI v2beta (sd3, core, ultra)
  • Replicate (flux, sdxl, ideogram, и любые owner/name:version)

Конфиг — ~/.config/imagegen-mcp/config.json. Per-provider env-файлы:

{
  "providers": {
    "openai": {
      "type": "openai",
      "envFile": "~/.config/imagegen-mcp/openai.env",
      "envVar": "OPENAI_API_KEY"
    },
    "local": {
      "type": "openai",
      "envFile": "~/.config/imagegen-mcp/local.env",
      "envVar": "LOCAL_API_KEY",
      "baseUrl": "http://localhost:8000/v1"
    }
  },
  "defaultProvider": "openai",
  "defaultModel": "gpt-image-1.5"
}

Wire в Claude Code:

claude mcp add imagegen -- npx -y tsx ~/projects/own-projects/imagegen-mcp/src/server.ts

После рестарта в Claude Code появляются mcp__imagegen__* tools. Всё.

Как это меняет flow для блога

Раньше: открыл ChatGPT (или Midjourney через Discord), руками собрал промпт с нуля, в голове восстановил какой стиль был на прошлой обложке, нажал генерацию, выбрал из вариантов, скачал PNG в ~/Downloads, перетащил в нужную папку проекта, и только потом в Claude Code в чате написал «вот, оформи как обложку» — она копировала файл и обновляла frontmatter, я ещё отдельно ходил кропить в 16:7.

Сейчас: в чате Claude Code пишу «нагенери cover для нового поста, продолжай cartoon-серию» — и она сама:

  1. Дёргает mcp__imagegen__generate_image с моим стандартным промпт-шаблоном, model gpt-image-1.5, size 1536x1024.
  2. Сразу же mcp__imagegen__crop_image до 1536×672 (16:7), mode cover.
  3. Пишет cover.png в apps/blog/public/assets/posts/<slug>/.
  4. Обновляет frontmatter в обеих локалях.
  5. Если что-то выглядит не очень — re-generate с поправленным промптом, не покидая чата.

Никаких UI-переключений, никаких drag-n-drop файлов между Finder-ом и проектом. И главное — style language серии живёт в docs/post-covers/ и в моём blog-CLAUDE.md, так что Claude сам предложит "продолжить серию" вместо того чтобы я каждый раз вспоминал какой именно был стиль. Эта самая статья — её обложка сгенерилась через MCP в тот момент когда я писал текст: «давай нарисуем что-нибудь подходящее, продолжая серию» → готово, в frontmatter, на диске, рендерится локально.

Подводные камни

  • gpt-image-1 ушла, gpt-image-1.5 — то что есть. Старая gpt-image-1 снята из production (для существующих проектов API возвращает does not exist). Если в стороннем туле или MCP-wrapper-е захардкожена gpt-image-1 — упадёт. Везде ставь gpt-image-1.5.
  • dall-e-3 не поддерживает edits. Только text-to-image. Edit/inpaint работает на gpt-image-1.5 (и архивном dall-e-2).
  • Native 16:7 не поддерживает ни один провайдер. gpt-image: 1024×1024 / 1024×1536 / 1536×1024. dall-e-3: добавляет 1792×1024. Ближайшее — 1536×1024, потом crop до 1536×672 через crop_image.
  • MCP-server enum хардкоды у популярных wrapper-ов. imagegen-mcp от spartanz51 знает только gpt-image-1 / dall-e-3 / dall-e-2 и падает на gpt-image-1.5. Моя версия принимает model как строку — что введёшь, то и пойдёт в API.

Что хочется добавить

  • Reference-image mode: для постов где есть фото-исходник, хочу прокидывать его в edit_image как reference, а не описывать словами. Прямо сейчас работает на gpt-image-1.5 через /v1/images/edits, но в clean tool wrapper-е ещё нужен smoother UX.
  • Batch covers — n: 4 вариантов сразу, выбираешь визуально. Сейчас прибито на n: 1 по дефолту, но параметр прокидывается.
  • Variations: dall-e-2 /v1/images/variations — для итераций "та же сцена немного иначе". Не реализовано в edit_image, надо отдельный tool.
  • Spark imggen — мой self-hosted Stable Diffusion на home-lab. Тип провайдера openai-compatible уже работает через custom baseUrl, осталось проверить с реальным backend-ом.

Если кому-то нужна заготовка для своих обложек — clone, edit config, claude mcp add, готово. Один файл ~/.config/imagegen-mcp/config.json определяет всё.