Skip to main content
Glama
gridhra
by gridhra

atx-mcp

English | 日本語 | 简体中文

汎用AIエージェント向けの、決定的(非生成)アセット変換MCPサーバー。Rustで書かれています。

編集意図(「地平線を水平にする」「16:9にクロップする」「少し明るくする」など)を宣言的な変換レシピとして実行し、すべての結果を不変のリビジョンとして追跡します。元のアセットは決して変更されません。

Before/after: 傾いた合成都市景観が水平化され、レベルが自動補正され、微妙なルックが適用された様子 傾き補正+自動レベル+ルック適用(完全に決定的なレシピ)— 左: 入力 / 右: 出力。

完全な設計は docs/DESIGN.md を参照してください。

ユースケース

  1. 記事用のアイキャッチ画像

    「この写真を水平にして、16:9、1600pxのアイキャッチにクロップして。WebPで。」 import_assetdetect_tilt(AIは既に水平に近い場合は補正をスキップします)→ apply_transform(rotate → crop → resize → encode)→ export_asset。元の画像は一切変更されず、同じレシピは常に同じ結果を再現します。

  2. SNS/CMS向けの複数サイズ

    「この写真のOGP、Instagramスクエア、サムネイル版を生成して。」 1つの元画像から、OGP 1200×630、Instagram 1080スクエア、400pxサムネイルが並列で生成されます。同じレシピ=同じリビジョンという冪等性により、再実行しても出力が二重に作成されることはありません。1語のプリセット名でも機能します。

  3. 公開しても安全

    「位置情報は確実に削除して。でも色は触らないで。」 strip_metadataexif)はGPSを含むEXIFを削除しつつ、ICCプロファイルは保持します。AIはinspect_imagehas_gpsを確認することで事前に警告することもできます。

  4. 色とルックの調整

    「空だけ青くして、他はそのままに。」 curves / levels / hsl / white_balancefilm_softプリセット、そしてimport_assetで独自の.cube LUTをインポートしてlutで適用することをカバーしています。

  5. 局所(マスク)調整

    「空だけ少し暗くして、地面はそのままに。」 generate_maskはマスク(グラデーション、輝度範囲、色相範囲)を生成します。調整に組み込んだ後、overlay:"mask"を指定したrender_previewで、確定する前に効果が及ぶ範囲を正確に確認できます。

  6. レイヤー合成

    「この写真のコピーをぼかして、スクリーン50%で合成して、柔らかなグローにして。」 layersスタックは16のブレンドモード、不透明度、マスクを組み合わせて、ソフトフォーカスのような再現可能な合成を構築します。

  7. 透かし、レタッチ、パースペクティブ補正

    「角にロゴを焼き付けて、電線を除去して、縦線の収束を直して。」 svg_overlayはロゴを焼き付け、clone/healはテクスチャとトーンの両方を合成して傷や電線を除去し、perspectiveは縦線の収束を補正します。

  8. 検証と説明責任

    「この画像の編集前と編集後を並べて見せて。」 compare_revisionsはBefore/Afterを並べて表示するか、mean_abs_diffなどの統計情報とともに差分ヒートマップを返します。すべてのリビジョンは系統(lineage)を保持するため、記事で使われた画像の完全な編集履歴を追跡・再現できます。しかもどのマシンでもバイト単位で同一です。

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、Windowsでは%LOCALAPPDATA%\Programs\atx-mcpです。アーカイブは展開前に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

手動でダウンロードする場合は、Releasesからatx-mcp-<version>-<target>.tar.gz(Windowsでは.zip)を取得してください。 対応ターゲット:

プラットフォーム

ターゲットトリプル

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

レシピ語彙のコンパクトなカタログ。各操作の1行説明と簡潔なパラメータヒント、組み込みプリセット名を含みます。オプションのcategory:"geometry"|"color"|"filter"|"output"で絞り込めます(読み取り専用)

explain_operation

1つの操作の完全なリファレンス: パラメータ表(型、範囲、必須/デフォルト、意味)、コピーして使えるJSON例、落とし穴。組み込みプリセット名も指定でき、その完全な操作リストを返します。不明な名前を指定すると、有効な操作とプリセットをグループ化して返します(読み取り専用)

import_asset

ローカル画像をワークスペースにインポートします(sha256冪等)。1ファイルの場合はpath、最大64ファイルのバッチの場合はpathsを受け取ります(失敗したファイルがあってもバッチは中断されません)。バイト列がこのワークスペース内のレシピの出力ですでにある場合は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)をフル解像度で適用し、新しいリビジョンを生成します(同じレシピは常に同じリビジョンを生成します)。1枚の画像にはrevision_id、最大64枚のバッチで同じレシピを実行するにはrevision_idsを受け取ります

compare_revisions

2つのリビジョンを長辺≤640に縮小し、layout:"side_by_side"|"stacked"で配置して1つのインライン画像に合成して返します(A/B比較やBefore/Afterの視覚比較用)。または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、1つの操作の完全なスキーマ・例・落とし穴は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はサイズなしを意味します — ルートの<svg>viewBoxも絶対的なwidth/heightもない)。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 は、パイプラインのその時点における画像の座標系でのオーバーレイの左上隅です(そのため、オーバーレイはリサイズ/クロップの後に配置してください)。負の値も許容され、はみ出しはクリップされます。widthheight を省略すると SVG の内在サイズでラスタライズされ、一方だけを指定するとアスペクト比を保ってスケールされ、両方指定すると正確なボックスに引き伸ばされます。— 内在サイズを持たない SVG は、両方指定しない限り構造化エラーになります。合成は layers と同じ W3C の公式と、同じ 16 個の blend_mode 値を使用します。

テキストは決してレンダリングされません。 atx はシステムフォントを読み込みません。インストールされているフォントはマシンごとに異なり、バイト単位の再現性を壊してしまうからです。<text> を含む SVG は、そのシェイプはレンダリングされますがグリフはレンダリングされず、警告が報告されます。— 読み込む前にベクターエディタでテキストをパス(アウトライン)に変換してください。そうすれば、すべてのマシンで結果が同一になります。

マスク(ローカル調整)

マスクとはグレースケール画像リビジョンです。その BT.709 輝度が重みとなり、白は「この操作を最大強度で適用する」、黒は「ピクセルをそのままにする」を意味します。14 個のトーン/フィルター操作(adjustcolor_matrixcurveslevelshsllutwhite_balanceblurmedianunsharp_maskconvolvegraingradient_mapauto_levels)はいずれもマスクを受け入れます。

  1. generate_mask は参照画像に対して、その画像とまったく同じ寸法で決定的にマスクを生成します:

kind

Parameters

選択される対象

linear_gradient

angle_degrees(0 = 上部の白が下に向かってフェード、正 = 時計回り)、startend(重みが 1→0 になる軸上の 0..1 の位置)

グラデーションフィルター(空、前景)

radial_gradient

center_xcenter_y(0..1 の相対値)、radius(半対角線の 0..1)、feather(0..1 の追加フェードオフ帯)

ビネットまたは被写体スポットライト

luminosity_range

minmax(0..255)、feather(範囲外のソフトショルダーの輝度単位)

ハイライト、中間調、シャドウ

color_range

hue_center(0..360)、hue_width(1..180 の半幅)、feather(追加度数)

1 つの色相ファミリー(空の青、葉の緑)

代わりに、独自のグレースケール画像を 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_previewoverlay:"mask"mask_revision_id を指定すると、重みが 0.5 を超える場所はプレビューが赤く着色され、それ以外は暗くなるため、コミットする前にカバレッジを確認できます。

マスクは LUT とまったく同様にリビジョン ID で参照されるため、同じ注事項が当てはまります。レシピハッシュには ID が含まれ、レシピはそのマスクを保持するワークスペース内でのみ再現されます。

レイヤー

レシピは、フラットな operations リストの代わりに(またはそれに加えて)layers スタックを保持できます。レイヤーは下から上に合成され、各レイヤーの 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 は通常の操作リストで、そのレイヤーのソースのみに適用されます。

  • maskblend_mode(デフォルト "normal")、opacity(デフォルト 1.0)は、レイヤーがその下のレイヤーにどのように合成されるかを制御します。

  • ブレンドモードは 16 個の W3C モードの 1 つです。分離可能な 12 モード normalmultiplyscreenoverlaydarkenlightencolor_dodgecolor_burnhard_lightsoft_lightdifferenceexclusion に加え、分離不可能な 4 モード huesaturationcolorluminosity です。

  • layers が存在する場合、トップレベルの operations仕上げパスとなり、合成結果に一度だけ適用されます。ここに resize と最終的な encode を置きます(encode は依然として最後で、最大 1 回だけ出現する必要があります)。

  • 完全なリファレンスは explain_operation {"operation":"layers"} を呼び出してください。

プリセット

apply_transformrender_previewrecipe(生の DSL)または presetpresets/ にある組み込みの名前付きレシピ)のいずれかを受け取ります — 2 つのうち正確に 1 つです:

Set

Preset

機能

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

BT.709 輝度 color_matrix による白黒

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

BT.709 輝度 color_matrix によるニュートラルな白黒

mono

bw_high_contrast

高コントラスト白黒: 輝度変換と強い S カーブ

mono

bw_red_filter

シミュレートされた赤フィルターを通した B&W(古典的な空の暗色化)

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 にクロップ、幅 1200px にリサイズ、WebP q82

social

x_wide_16_9

X(Twitter)ワイドカード: 16:9 にクロップ、幅 1600px にリサイズ、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

大きなヒーロー/バナー画像: 2400px 以内に収める、WebP q85

building block

soft_vignette

単体での控えめなビネット。他のルックの後で重ねる用

building block

grain_fine

単体での軽く細かな決定的グレイン。重ねる用

プリセットは単なる糖衣構文です。プリセットは自身のレシピに解決され、通常のパイプラインを通ります。recipe_hash(冪等性キー)は解決後のレシピに対して計算されるため、プリセット呼び出しと同等の生レシピは同じリビジョンになります。

保証

  • 決定的: 同じ入力 + 同じレシピは常にバイト単位で同一の出力を生成します(ゴールデンテストで回帰チェック済み)

  • 冪等: レシピは正規化され(キーをソート、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 フォームファクタや Markdown の ATX スタイル見出しとは関係ありません。

ライセンス

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