Skip to main content
Glama
gridhra
by gridhra

atx-mcp

English | 日本語 | 简体中文

Детерминированный (не-генеративный) MCP-сервер преобразования ассетов для универсальных ИИ-агентов, написанный на Rust.

Он исполняет редакторское намерение — «выровняй горизонт, обрежь до 16:9, сделай немного ярче» — как декларативный рецепт преобразования и отслеживает каждый результат как неизменяемую ревизию. Оригинальный ассет никогда не изменяется.

До/после: наклонный синтетический городской пейзаж выровнен, уровни автокорректированы, применён ненавязчивый стиль Коррекция наклона + автоуровни + применённый стиль (полностью детерминированный рецепт) — слева: вход / справа: выход.

Полное описание см. в docs/DESIGN.md.

Варианты использования

  1. Привлекающее изображение для статьи

    «Выровняй это фото и обрежь до 16:9, 1600px, для обложки. WebP.» import_assetdetect_tilt (ИИ пропускает коррекцию, если изображение уже почти ровное) → apply_transform (rotate → crop → resize → encode) → export_asset. Оригинал никогда не затрагивается, и один и тот же рецепт каждый раз воспроизводит один и тот же результат.

  2. Несколько размеров для соцсетей/CMS

    «Сгенерируй OGP, квадратную версию для Instagram и миниатюру этого фото.» Один оригинал расходится параллельно на OGP 1200×630, квадрат 1080 для Instagram и миниатюру 400px. Идемпотентность «один и тот же рецепт — одна и та же ревизия» означает, что повторный запуск никогда не создаёт вывод дважды; достаточно и однословного имени пресета.

  3. Безопасно для публикации

    «Точно удали данные о местоположении, но не трогай цвета.» strip_metadata (exif) удаляет EXIF, включая GPS, сохраняя ICC-профиль нетронутым. ИИ также может предупредить заранее, проверив has_gps через inspect_image.

  4. Цветовые и стилевые корректировки

    «Сделай только небо синее, всё остальное не трогай.» Охватывает curves / levels / hsl / white_balance, пресет film_soft, а также импорт собственного .cube LUT через import_asset и его применение через lut.

  5. Локальные (маскированные) корректировки

    «Немного затемни только небо, а землю оставь как есть.» generate_mask создаёт маску (градиент, диапазон яркости или диапазон оттенка); после подключения маски к корректировке render_preview с overlay:"mask" покажет точно, где изменение подействует, прежде чем вы его примените.

  6. Композитинг слоёв

    «Размой копию этого фото и смешай её в режиме screen на 50% для мягкого свечения.» Стек layers объединяет 16 режимов наложения, непрозрачность и маски для создания воспроизводимых композиций, например мягкого фокуса.

  7. Водяные знаки, ретушь и перспектива

    «Впечатай мой логотип в угол, убери линии электропередач и исправь сходящиеся вертикали.» svg_overlay впечатывает логотип, clone/heal удаляют дефекты или провода, компонуя текстуру и тон, а perspective исправляет сходящиеся вертикали.

  8. Проверка и подотчётность

    «Покажи это изображение до и после правок, бок о бок.» compare_revisions размещает до/после бок о бок или возвращает тепловую карту различий со статистикой вроде mean_abs_diff. Каждая ревизия сохраняет свою родословную, поэтому полную историю правок любого изображения, использованного в статье, можно проследить и воспроизвести — побайтно идентично на любой машине.

Чего atx не делает — генеративного редактирования, RAW-конвертации, ML-автокадрирования — это вне области применения; дорожную карту см. в docs/DESIGN.md.

Related MCP server: img-convert MCP Server

Установка

Инструментарий Rust не требуется. Выберите один из вариантов.

1. npx (проще всего, рекомендуется)

Достаточно Node.js 18+. Готовый нативный бинарник для вашей платформы подтягивается автоматически через optionalDependencies.

# --scope user makes it available in every project (omit for current-project only)
claude mcp add --scope user asset-transform -- npx -y atx-mcp --workspace /path/to/asset-workspace

Или добавьте его напрямую в конфиг вашего MCP-клиента:

{
  "mcpServers": {
    "asset-transform": {
      "command": "npx",
      "args": ["-y", "atx-mcp", "--workspace", "/path/to/asset-workspace"]
    }
  }
}

2. Готовый бинарник

Скрипты установки (по умолчанию устанавливается в ~/.local/bin или в %LOCALAPPDATA%\Programs\atx-mcp на Windows; архив проверяется по SHA256SUMS перед распаковкой):

# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/gridhra/atx-mcp/main/scripts/install.sh | sh
# Windows
irm https://raw.githubusercontent.com/gridhra/atx-mcp/main/scripts/install.ps1 | iex

Для ручной загрузки возьмите atx-mcp-<version>-<target>.tar.gz (.zip на Windows) со страницы Releases. Поддерживаемые целевые платформы:

Платформа

Target triple

macOS (Apple Silicon)

aarch64-apple-darwin

macOS (Intel)

x86_64-apple-darwin

Linux x86_64

x86_64-unknown-linux-musl (статически слинкован, glibc не требуется)

Linux arm64

aarch64-unknown-linux-musl (статически слинкован, glibc не требуется)

Windows x86_64

x86_64-pc-windows-msvc

claude mcp add asset-transform -- ~/.local/bin/atx-mcp --workspace /path/to/asset-workspace

3. Сборка из исходников (любая другая платформа)

Нужны только инструментарий Rust и C-компилятор (для сборки libwebp из его приложенного исходного кода).

cargo build --release
# => target/release/atx-mcp
claude mcp add asset-transform -- "$PWD/target/release/atx-mcp" --workspace /path/to/asset-workspace

--workspace (env: ATX_WORKSPACE) — это каталог, используемый как хранилище ассетов. Он создаётся автоматически, если его нет.

Инструменты (11)

Инструмент

Назначение

list_operations

Компактный каталог словаря рецептов: каждая операция с однострочным описанием и краткими подсказками по параметрам, плюс встроенные имена пресетов. Необязательный category:"geometry"|"color"|"filter"|"output" сужает выбор (только чтение)

explain_operation

Полный справочник по одной операции: таблица параметров (тип, диапазон, обязательность/значение по умолчанию, семантика), готовые к вставке примеры JSON и подводные камни. Имя встроенного пресета тоже работает и возвращает полный список его операций. Неизвестное имя возвращает допустимые операции и пресеты, сгруппированные (только чтение)

import_asset

Импортирует локальное изображение в рабочее пространство (идемпотентность по sha256). Принимает path для одного файла или paths для пакета до 64 файлов (неудачный файл не прерывает пакет). Предупреждает через already_derived_from, когда байты уже являются результатом рецепта в этом рабочем пространстве

inspect_image

Проверяет размеры, EXIF, ICC-профиль, наличие GPS-данных и т. д. (только чтение)

detect_tilt

Оценивает угол наклона через Canny+Hough (грубо) плюс профиль проекции (уточнение до 0,1°). Также возвращает оценки для горизонтальных/вертикальных линий; полная кривая оценок включается опционально через include_score_curve:true. Возвращает «не корректировать», если уверенность низкая (только чтение)

generate_mask

Создаёт детерминированную полутоновую маску (linear_gradient / radial_gradient / luminosity_range / color_range) в виде PNG-ревизии с теми же размерами, что и у эталонного изображения, для использования в поле mask операции (идемпотентно)

render_preview

Применяет рецепт (или preset) в низком разрешении (длинная сторона ≤768) и возвращает его как встроенное изображение. overlay:"grid"|"thirds"|"horizon" накладывает вспомогательные линии композиции, а overlay:"mask"mask_revision_id) подсвечивает область покрытия маски (рисуется только на превью; на реальное преобразование не влияет)

apply_transform

Применяет рецепт (или preset) в полном разрешении и создаёт новую ревизию (один и тот же рецепт всегда даёт одну и ту же ревизию). Принимает revision_id для одного изображения или revision_ids для применения одного и того же рецепта к пакету до 64 изображений

compare_revisions

Уменьшает две ревизии до длинной стороны ≤640 и возвращает их объединёнными в одно встроенное изображение, расположенными через layout:"side_by_side"|"stacked" (для визуального сравнения A/B и до/после) или layout:"diff" для создания тепловой карты попиксельной разницы и статистики mean_abs_diff/max_abs_diff/changed_pixel_ratio (требует одинаковых размеров)

list_assets

Читает журнал ревизий (только чтение)

export_asset

Записывает ревизию в указанный путь (существующий файл перезаписывается только при явно указанном overwrite:true)

Пример рецепта

{
  "operations": [
    { "op": "rotate", "angle_degrees": -1.8 },
    { "op": "crop", "aspect_ratio": "16:9" },
    { "op": "resize", "width": 1600 },
    { "op": "encode", "format": "webp", "quality": 82 }
  ]
}

Поддерживаемые операции (27): auto_orient / rotate / perspective / crop (crop, pad) / resize (cover, contain, fill) / adjust / color_matrix / curves / levels / lut / white_balance / hsl / blur / median / unsharp_mask / convolve / clone / heal / svg_overlay / flip / vignette / grain / gradient_map / pixelate / auto_levels / encode (jpeg, png, webp, avif) / strip_metadata. Словарь операций намеренно не включён в схемы инструментов: вызывайте list_operations для актуального каталога и explain_operation для полной схемы, примеров и подводных камней конкретной операции.

LUT (.cube)

.cube 3D/1D LUT — это ассет, а не изображение: сначала импортируйте его, затем укажите рецепту на созданную им ревизию.

  1. Импортируйте файл .cube через import_asset. Он сохраняется как неизменяемая ревизия с mime_type: "application/x-cube" (inspect_image намеренно отказывается его обрабатывать — это не изображение).

  2. Используйте возвращённый revision_id в рецепте:

{ "op": "lut", "lut_revision_id": "rev_...", "strength": 0.8 }

strength (0..1, по умолчанию 1.0) линейно смешивается с оригиналом. Поскольку ревизии неизменяемы, включение указанного id в recipe_hash делает преобразование полностью детерминированным — но это также означает, что рецепт воспроизводим только внутри рабочего пространства, где хранится этот LUT, поэтому при переносе стиля между машинами переносите .cube вместе с рецептом. Обращение к неизвестному id завершается структурированной ошибкой до начала какой-либо работы с пикселями.

Наложения SVG (логотипы и водяные знаки)

.svg — это векторный ассет, как и .cube LUT: сначала импортируйте его, затем впечатывайте его в растровое изображение из рецепта.

  1. Импортируйте файл .svg через import_asset. Он сохраняется как неизменяемая ревизия с mime_type: "image/svg+xml", а в сводке сообщается собственный размер SVG (0x0 означает, что его нет — нет viewBox и абсолютных width/height у корневого <svg>). inspect_image намеренно отказывается его обрабатывать: это векторный ассет, а не растровое изображение.

  2. Используйте возвращённый revision_id в рецепте:

{ "op": "svg_overlay", "svg_revision_id": "rev_...",
  "x": 24, "y": 24, "width": 320, "opacity": 0.25, "blend_mode": "normal" }

x/y — это левый верхний угол оверлея в координатах изображения на этом этапе конвейера (поэтому размещайте оверлей после изменения размера/кадрирования); отрицательные значения допустимы, а выходящее за границы обрезается. Если опустить width и height, растеризация выполняется в собственном размере SVG; укажите одно значение, чтобы масштабировать с сохранением пропорций, или оба, чтобы растянуть до точного прямоугольника — SVG без собственного размера является структурированной ошибкой, если не заданы оба. Композитинг использует ту же формулу W3C и те же 16 значений blend_mode, что и слои.

Текст никогда не отрисовывается. atx не загружает системные шрифты, потому что установленные шрифты отличаются от машины к машине и нарушили бы побайтовую воспроизводимость. SVG, содержащий <text>, отображает его фигуры, но не глифы, и выдаёт предупреждение — преобразуйте текст в кривые (контуры) в своём векторном редакторе перед импортом, и результат будет идентичным на любой машине.

Маски (локальные корректировки)

Маска — это ревизия изображения в градациях серого: её яркость BT.709 является весом, поэтому белый означает «применить эту операцию в полную силу», а чёрный — «оставить пиксель без изменений». Любая из 14 операций тона/фильтра (adjust, color_matrix, curves, levels, hsl, lut, white_balance, blur, median, unsharp_mask, convolve, grain, gradient_map, auto_levels) принимает её.

  1. generate_mask детерминированно создаёт её на основе эталонного изображения, с точностью до размеров этого изображения:

kind

Параметры

Что выбирает

linear_gradient

angle_degrees (0 = белый сверху с затуханием вниз, положительное значение = по часовой стрелке), start, end (позиции 0..1 вдоль оси, где вес переходит 1→0)

Градиентный фильтр (небо, передний план)

radial_gradient

center_x, center_y (относительные 0..1), radius (0..1 от половины диагонали), feather (0..1 — дополнительная полоса спадания)

Виньетка или пятно-акцент на объекте

luminosity_range

min, max (0..255), feather (единицы яркости мягкого перехода за пределами диапазона)

Света, средние тона или тени

color_range

hue_center (0..360), hue_width (1..180 — полуширина), feather (дополнительные градусы)

Одно семейство оттенков (голубое небо, зелёная листва)

Вместо этого вы также можете импортировать собственное изображение в градациях серого через import_asset.

  1. Прикрепите возвращённый revision_id к операции:

{ "op": "curves", "master": [[0,0],[128,168],[255,255]],
  "mask": { "revision_id": "rev_...", "invert": false, "feather_px": 8.0 } }

invert (по умолчанию false) инвертирует вес в 1-w; feather_px (по умолчанию 0.0) размывает край маски на эту сигму гауссова размытия в пикселях текущего изображения.

  1. render_preview с overlay:"mask" и mask_revision_id окрашивает предпросмотр в красный там, где вес превышает 0.5, и затемняет его в остальных местах, чтобы покрытие можно было проверить до фиксации.

Маски, как и LUT, ссылаются на идентификатор ревизии, поэтому действует та же оговорка: хэш рецепта включает идентификатор, и рецепт воспроизводится только внутри рабочего пространства, содержащего эту маску.

Слои

Рецепт может содержать стек layers вместо плоского списка operations (или в дополнение к нему). Слои компонуются снизу вверх: ops каждого слоя выполняются над его собственным источником, прежде чем слой будет смешан с текущим композитом:

{
  "layers": [
    { "source": "base", "ops": [] },
    {
      "source": { "revision_id": "rev_..." },
      "ops": [{ "op": "blur", "sigma": 8 }],
      "blend_mode": "multiply",
      "opacity": 0.6
    }
  ],
  "operations": [
    { "op": "resize", "width": 1600 },
    { "op": "encode", "format": "webp", "quality": 82 }
  ]
}
  • source — это либо "base" (входная ревизия, переданная в apply_transform / render_preview), либо {"revision_id": "rev_..."} (любая другая ревизия, уже находящаяся в рабочем пространстве). Источник каждого слоя должен точно совпадать по размерам с базовым изображением, иначе рецепт завершается структурированной ошибкой до начала работы с пикселями.

  • ops — обычный список операций, применяемый только к источнику этого слоя.

  • mask, blend_mode (по умолчанию "normal") и opacity (по умолчанию 1.0) управляют тем, как слой компонуется со слоями под ним.

  • Режим наложения — один из 16 режимов W3C: 12 разделимых режимов normal, multiply, screen, overlay, darken, lighten, color_dodge, color_burn, hard_light, soft_light, difference, exclusion, плюс 4 неразделимых режима hue, saturation, color, luminosity.

  • Когда присутствует layers, верхнеуровневый operations становится финишным проходом, применяемым один раз к результату композитинга — именно сюда относятся resize и финальный encode (encode по-прежнему должен быть последним и встречаться не более одного раза).

  • Вызовите explain_operation {"operation":"layers"} для получения полного справочника.

Пресеты

apply_transform и render_preview принимают либо recipe (непосредственно DSL), либо preset (встроенный именованный рецепт из presets/) — ровно одно из двух:

Набор

Пресет

Что делает

basics

eyecatch_16_9

Кадрирование по центру до 16:9, изменение размера до 1600px в ширину, WebP q82

basics

film_soft

Мягкий плёночный вид: мягкая S-кривая плюс подтяжка к яркости на 15%

basics

product_clean

Чистое предметное фото: почти нейтральный баланс белого, подъём уровней, лёгкое повышение резкости

basics

thumbnail_square

Кадрирование по центру до 1:1, изменение размера до 800x800, WebP q80

basics

web_optimize

Вписать в 2000x2000 без увеличения, WebP q80

basics

grayscale

Чёрно-белое через color_matrix на основе яркости BT.709

basics

sepia

Классический сепийный тон через color_matrix

film

film_warm

Тёплая плёнка: янтарный баланс белого, мягкая S-кривая, лёгкое зерно

film

film_cool

Холодная плёнка: баланс белого с уходом в синий, мягкая S-кривая, лёгкое зерно

film

matte_fade

Выцветший матовый эффект: поднятые чёрные через curves, лёгкая десатурация

film

film_grain_strong

Сильное крупное зерно поверх мягкой S-кривой (вид с форсированной/высокой ISO)

film

cinema_teal_orange

Кинематографический бирюзово-оранжевый грейд через точечные сдвиги hsl

mono

bw_neutral

Нейтральное чёрно-белое через color_matrix на основе яркости BT.709

mono

bw_high_contrast

Высококонтрастное чёрно-белое: преобразование в яркость плюс сильная S-кривая

mono

bw_red_filter

Ч/б через имитацию красного фильтра (классическое затемнение неба)

mono

bw_soft

Мягкое малоконтрастное чёрно-белое (матовая кривая)

mono

duotone_navy_cream

Дуотон «тёмно-синий — кремовый» через gradient_map

editorial

product_white

Растяжка автоуровней, нейтральный баланс белого, финальное повышение резкости

editorial

food_vivid

Усиление насыщенности тёплых оранжевых/жёлтых тонов плюс подъём контраста

editorial

portrait_soft

Мягкая матовая кривая, лёгкая десатурация, тонкая виньетка

editorial

landscape_punch

Подъём контраста и насыщенности плюс лёгкая виньетка

editorial

architecture_clean

Автоуровни, повышение резкости, лёгкая десатурация (в паре с ручной операцией perspective)

social

og_1200x630

Изображение для шаринга Open Graph: кадрирование 1200:630, изменение размера до 1200 в ширину, WebP q82

social

x_wide_16_9

Широкая карточка X (Twitter): кадрирование 16:9, изменение размера до 1600 в ширину, WebP q82

social

instagram_square_1080

Квадратный пост Instagram: кадрирование 1:1, изменение размера до 1080x1080, WebP q85

social

instagram_portrait_4_5

Вертикальный пост Instagram: кадрирование 4:5, изменение размера до 1080x1350, WebP q85

social

youtube_thumb_1280x720

Миниатюра YouTube: кадрирование 16:9, изменение размера до 1280x720, WebP q85

social

hero_2400

Большое hero/баннерное изображение: вписать в 2400px, WebP q85

building block

soft_vignette

Лёгкая виньетка сама по себе для наложения поверх других эффектов

building block

grain_fine

Лёгкое, мелкое, детерминированное зерно само по себе, для наложения

Пресет — это просто синтаксический сахар: он разворачивается в свой рецепт и проходит обычный конвейер, а recipe_hash (ключ идемпотентности) вычисляется от разрешённого рецепта — поэтому вызов пресета и эквивалентный «сырой» рецепт приводят к одной и той же ревизии.

Гарантии

  • Детерминированность: один и тот же вход + один и тот же рецепт всегда дают побайтово идентичный результат (проверяется регрессионными golden-тестами)

  • Идемпотентность: рецепты нормализуются (ключи сортируются, значения f64 квантуются до сетки 1e-6) и хэшируются с помощью sha256. Если пара (входная ревизия, хэш рецепта) совпадает с существующей, возвращается существующая ревизия, а не новая

  • Оригиналы защищены: objects/ — это хранилище, доступное только для добавления и адресуемое по содержимому: API удаления или перезаписи не существует

Разработка

cargo test --workspace     # unit + integration + property (proptest) tests
cargo clippy --workspace --all-targets -- -D warnings

Структура крейтов: atx-core (движок рецептов/трансформаций) / atx-geometry (обнаружение наклона) / atx-store (неизменяемое хранилище ресурсов) / atx-mcp (rmcp stdio-сервер).

Процесс релиза описан в RELEASING.md.

Название

«atx» расшифровывается как Asset Transform; завершающая x следует привычному сокращению для «transform» (как в xform / tx). Это имя было выбрано как короткое и удобное для ввода имя бинарного файла и префикс крейтов (atx-core и т.д.), и оно не связано ни с форм-фактором PC ATX, ни с ATX-заголовками в стиле Markdown.

Лицензия

MIT. См. LICENSE.

Если atx-mcp экономит ваше время, вы можете угостить меня кофе

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

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/gridhra/atx-mcp'

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