Боль
Каждый блог-пост у меня теперь идёт с editorial-обложкой — cartoon, 16:7, серия robot-vacuum desk-scene. До этого MCP флоу выглядел так:
- Открываешь другой инструмент: ChatGPT с image-генерацией, Midjourney через Discord, web-DALL·E, или какой-нибудь Leonardo. Каждый со своим UI.
- Пишешь промпт с нуля. Каждый раз заново вспоминаешь: какой именно стиль был у прошлой обложки? Cartoon с какими акцентами? Swiss-cartoon или просто flat? Какой персонаж? — нет ни истории, ни шаблона, который можно подцепить.
- Жмёшь генерацию. Хочется варианты — генеришь несколько. Что-то нравится — скачиваешь PNG из браузера.
- Идёшь в Finder, перетаскиваешь файл в нужную папку проекта (
apps/blog/public/assets/posts/<slug>/). Или в Claude Code как attachment кидаешь — и потом просишь: "вот картинка, оформи как обложку". - 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/fillmodes, любой 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-серию» — и она сама:
- Дёргает
mcp__imagegen__generate_imageс моим стандартным промпт-шаблоном, modelgpt-image-1.5, size1536x1024. - Сразу же
mcp__imagegen__crop_imageдо 1536×672 (16:7), mode cover. - Пишет cover.png в
apps/blog/public/assets/posts/<slug>/. - Обновляет frontmatter в обеих локалях.
- Если что-то выглядит не очень — 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 определяет всё.
