atx-mcp
atx-mcp
汎用AIエージェント向けの、決定的(非生成)アセット変換MCPサーバー。Rustで書かれています。
編集意図(「地平線を水平にする」「16:9にクロップする」「少し明るくする」など)を宣言的な変換レシピとして実行し、すべての結果を不変のリビジョンとして追跡します。元のアセットは決して変更されません。
傾き補正+自動レベル+ルック適用(完全に決定的なレシピ)— 左: 入力 / 右: 出力。
完全な設計は docs/DESIGN.md を参照してください。
ユースケース
記事用のアイキャッチ画像
「この写真を水平にして、16:9、1600pxのアイキャッチにクロップして。WebPで。」
import_asset→detect_tilt(AIは既に水平に近い場合は補正をスキップします)→apply_transform(rotate → crop → resize → encode)→export_asset。元の画像は一切変更されず、同じレシピは常に同じ結果を再現します。SNS/CMS向けの複数サイズ
「この写真のOGP、Instagramスクエア、サムネイル版を生成して。」 1つの元画像から、OGP 1200×630、Instagram 1080スクエア、400pxサムネイルが並列で生成されます。同じレシピ=同じリビジョンという冪等性により、再実行しても出力が二重に作成されることはありません。1語のプリセット名でも機能します。
公開しても安全
「位置情報は確実に削除して。でも色は触らないで。」
strip_metadata(exif)はGPSを含むEXIFを削除しつつ、ICCプロファイルは保持します。AIはinspect_imageのhas_gpsを確認することで事前に警告することもできます。色とルックの調整
「空だけ青くして、他はそのままに。」
curves/levels/hsl/white_balance、film_softプリセット、そしてimport_assetで独自の.cubeLUTをインポートしてlutで適用することをカバーしています。局所(マスク)調整
「空だけ少し暗くして、地面はそのままに。」
generate_maskはマスク(グラデーション、輝度範囲、色相範囲)を生成します。調整に組み込んだ後、overlay:"mask"を指定したrender_previewで、確定する前に効果が及ぶ範囲を正確に確認できます。レイヤー合成
「この写真のコピーをぼかして、スクリーン50%で合成して、柔らかなグローにして。」
layersスタックは16のブレンドモード、不透明度、マスクを組み合わせて、ソフトフォーカスのような再現可能な合成を構築します。透かし、レタッチ、パースペクティブ補正
「角にロゴを焼き付けて、電線を除去して、縦線の収束を直して。」
svg_overlayはロゴを焼き付け、clone/healはテクスチャとトーンの両方を合成して傷や電線を除去し、perspectiveは縦線の収束を補正します。検証と説明責任
「この画像の編集前と編集後を並べて見せて。」
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) |
|
macOS (Intel) |
|
Linux x86_64 |
|
Linux arm64 |
|
Windows x86_64 |
|
claude mcp add asset-transform -- ~/.local/bin/atx-mcp --workspace /path/to/asset-workspace3. ソースからビルド(その他のプラットフォーム)
必要なのは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)
ツール | 役割 |
| レシピ語彙のコンパクトなカタログ。各操作の1行説明と簡潔なパラメータヒント、組み込みプリセット名を含みます。オプションの |
| 1つの操作の完全なリファレンス: パラメータ表(型、範囲、必須/デフォルト、意味)、コピーして使えるJSON例、落とし穴。組み込みプリセット名も指定でき、その完全な操作リストを返します。不明な名前を指定すると、有効な操作とプリセットをグループ化して返します(読み取り専用) |
| ローカル画像をワークスペースにインポートします(sha256冪等)。1ファイルの場合は |
| 寸法、EXIF、ICCプロファイル、GPSデータの有無などを検査します(読み取り専用) |
| 傾き角度をCanny+Hough(粗い推定)と投影プロファイル(0.1°未満の精密化)で推定します。水平/垂直系統の推定値も返します。完全なスコア曲線は |
| 決定的なグレースケールマスク( |
| レシピ(または |
| レシピ(または |
| 2つのリビジョンを長辺≤640に縮小し、 |
| リビジョンレジャーを読み取ります(読み取り専用) |
| リビジョンを指定されたパスに書き出します(既存ファイルは |
レシピ例
{
"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は画像ではなくアセットです。まずインポートし、レシピからそのリビジョンを参照します。
.cubeファイルをimport_assetします。mime_type: "application/x-cube"を持つ不変のリビジョンとして保存されます(inspect_imageは意図的に拒否します — 画像ではないため)。返された
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と同様にベクターアセットです。まずインポートし、レシピからラスター画像に焼き付けます。
.svgファイルをimport_assetします。mime_type: "image/svg+xml"を持つ不変のリビジョンとして保存され、サマリはSVGの内在サイズを報告します(0x0はサイズなしを意味します — ルートの<svg>にviewBoxも絶対的なwidth/heightもない)。inspect_imageは意図的に拒否します: これはベクターアセットであり、画像ではありません。返された
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 は、両方指定しない限り構造化エラーになります。合成は layers と同じ W3C の公式と、同じ 16 個の blend_mode 値を使用します。
テキストは決してレンダリングされません。 atx はシステムフォントを読み込みません。インストールされているフォントはマシンごとに異なり、バイト単位の再現性を壊してしまうからです。
<text>を含む SVG は、そのシェイプはレンダリングされますがグリフはレンダリングされず、警告が報告されます。— 読み込む前にベクターエディタでテキストをパス(アウトライン)に変換してください。そうすれば、すべてのマシンで結果が同一になります。
マスク(ローカル調整)
マスクとはグレースケール画像リビジョンです。その BT.709 輝度が重みとなり、白は「この操作を最大強度で適用する」、黒は「ピクセルをそのままにする」を意味します。14 個のトーン/フィルター操作(adjust、color_matrix、curves、levels、hsl、lut、white_balance、blur、median、unsharp_mask、convolve、grain、gradient_map、auto_levels)はいずれもマスクを受け入れます。
generate_maskは参照画像に対して、その画像とまったく同じ寸法で決定的にマスクを生成します:
| Parameters | 選択される対象 |
|
| グラデーションフィルター(空、前景) |
|
| ビネットまたは被写体スポットライト |
|
| ハイライト、中間調、シャドウ |
|
| 1 つの色相ファミリー(空の青、葉の緑) |
代わりに、独自のグレースケール画像を import_asset することもできます。
返された
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)は現在の画像のピクセル単位で、そのガウスシグマによってマスクの端をぼかします。
render_previewにoverlay:"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は通常の操作リストで、そのレイヤーのソースのみに適用されます。mask、blend_mode(デフォルト"normal")、opacity(デフォルト1.0)は、レイヤーがその下のレイヤーにどのように合成されるかを制御します。ブレンドモードは 16 個の W3C モードの 1 つです。分離可能な 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は依然として最後で、最大 1 回だけ出現する必要があります)。完全なリファレンスは
explain_operation {"operation":"layers"}を呼び出してください。
プリセット
apply_transform と render_preview は recipe(生の DSL)または preset(presets/ にある組み込みの名前付きレシピ)のいずれかを受け取ります — 2 つのうち正確に 1 つです:
Set | Preset | 機能 |
basics |
| 16:9 にセンタークロップ、幅 1600px にリサイズ、WebP q82 |
basics |
| ソフトなフィルム調: 緩やかな S カーブと輝度方向への 15% の引き寄せ |
basics |
| クリーンな商品写真: ほぼニュートラルなホワイトバランス、レベル補正で持ち上げ、軽いシャープ化 |
basics |
| 1:1 にセンタークロップ、800x800 にリサイズ、WebP q80 |
basics |
| 拡大なしで 2000x2000 に収める、WebP q80 |
basics |
| BT.709 輝度 |
basics |
|
|
film |
| 暖色フィルム風: アンバーなホワイトバランス、ソフトな S カーブ、軽いグレイン |
film |
| 寒色フィルム風: 青寄りのホワイトバランス、ソフトな S カーブ、軽いグレイン |
film |
| フェードしたマット調: |
film |
| 緩やかな S カーブの上に重く粗いグレイン(プッシュ/高 ISO 風) |
film |
| ターゲットを絞った |
mono |
| BT.709 輝度 |
mono |
| 高コントラスト白黒: 輝度変換と強い S カーブ |
mono |
| シミュレートされた赤フィルターを通した B&W(古典的な空の暗色化) |
mono |
| ソフトで低コントラストな白黒(マットカーブ) |
mono |
|
|
editorial |
| オートレベルで伸長、ニュートラルなホワイトバランス、最終シャープ化 |
editorial |
| 暖色のオレンジ/イエローの彩度ブーストとコントラストの引き上げ |
editorial |
| ソフトなマットカーブ、軽い彩度低下、控えめなビネット |
editorial |
| コントラストと彩度の引き上げに加えて軽いビネット |
editorial |
| オートレベル、シャープ化、わずかな彩度低下(手動の |
social |
| Open Graph 共有画像: 1200:630 にクロップ、幅 1200px にリサイズ、WebP q82 |
social |
| X(Twitter)ワイドカード: 16:9 にクロップ、幅 1600px にリサイズ、WebP q82 |
social |
| Instagram スクエア投稿: 1:1 にクロップ、1080x1080 にリサイズ、WebP q85 |
social |
| Instagram 縦長投稿: 4:5 にクロップ、1080x1350 にリサイズ、WebP q85 |
social |
| YouTube サムネイル: 16:9 にクロップ、1280x720 にリサイズ、WebP q85 |
social |
| 大きなヒーロー/バナー画像: 2400px 以内に収める、WebP q85 |
building block |
| 単体での控えめなビネット。他のルックの後で重ねる用 |
building block |
| 単体での軽く細かな決定的グレイン。重ねる用 |
プリセットは単なる糖衣構文です。プリセットは自身のレシピに解決され、通常のパイプラインを通ります。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.
This server cannot be installed
Maintenance
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
Image processing for AI agents: resize, convert, compress, crop, and web-ready AI-generated images.
Video, audio, and image processing for AI agents: convert, transcribe, upscale - 150+ operations.
Design, save, and run outcome-aligned AI workflows and verifiers, with reliable image output.
AI-native digital asset management: semantic search, generative image edits, and CDN delivery.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables comprehensive image editing operations including resizing, format conversion, cropping, compression, rotation, flipping, and batch processing. Supports JPEG, PNG, WebP, and AVIF formats with quality control and metadata extraction.83118MIT
- AlicenseNot gradedqualityCmaintenanceProvides AI agents with tools to convert images between formats and inspect image metadata, enabling seamless image processing within agent workflows.113MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to perform image processing tasks such as sprite sheet splitting, resizing, cropping, and batch operations on local images.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to read images with metadata, OCR text, regions, and citeable evidence without relying on generative LLMs.282MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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