atx-mcp について
atx-mcpはRust製のMCPサーバーで、再現可能な素材編集を必要とするAIエージェント向けに、決定論的な非生成型画像編集を行います。元画像を保持し、不変のリビジョンを記録するため、編集の再現と確認ができます。
主な機能
- 01宣言的な画像変換レシピの適用
- 02元画像の保持と不変リビジョンの記録
- 03トリミング、リサイズ、色調整、レイヤー合成
- 04画像の検査とマスク生成
- 05リビジョン比較と素材の書き出し
活用シーン
- 01記事用画像やアイキャッチのトリミング
- 02SNSやCMS向けの複数サイズ作成
- 03公開前のGPSメタデータ削除
- 04画像編集履歴の確認と再現
MCP 対応
MCPサーバーはstdioを使い、画像素材のインポート、検査、変換、プレビュー、比較、書き出しを行う13のツールを公開します。MCPクライアントは設定されたワークスペース内の素材にレシピを適用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
atx-mcp
汎用 AI エージェント向けの、決定論的(生成型ではない)アセット変換 MCP サーバーです。Rust で書かれています。
「水平線をまっすぐにして、16:9 にトリミングし、少し明るくする」といった編集指示を宣言型の変換レシピとして実行し、結果をすべて不変のリビジョンとして追跡します。元のアセットが変更されることはありません。
傾き補正+レベルの自動補正+ルックの適用(完全に決定論的なレシピ)— 左:入力/右:出力。
設計の詳細については、docs/DESIGN.md をご覧ください。
ユースケース
-
記事用のアイキャッチ画像
「この写真の傾きを直して、16:9、1600pxのアイキャッチにトリミングしてください。WebPで。」
import_asset→detect_tilt(すでにほぼ水平な場合、AIは補正をスキップします) →apply_transform(回転 → トリミング → リサイズ → エンコード) →export_asset。元の画像には一切手を加えず、同じレシピで毎回同じ結果を再現できます。 -
SNS/CMS向けの複数サイズ
「この写真からOGP用、Instagramの正方形用、サムネイル用のバージョンを作成してください。」 1つのオリジナル画像から、OGP用の1200×630、Instagram用の1080px正方形、400pxのサムネイルを並列で生成します。同じレシピと同じリビジョンの冪等性により、再実行しても出力が二重に作成されることはありません。プリセット名を一言指定するだけでも使えます。
-
安心して公開
「位置情報は必ず削除してください。ただし、色には手を加えないでください。」
strip_metadata(exif)は、ICCプロファイルを保持したままGPSを含むEXIFを削除します。inspect_imageからhas_gpsを確認して、AIが事前に警告することもできます。 -
色とルックの調整
「空だけを青くして、ほかはすべてそのままにしてください。」
curves/levels/hsl/white_balance、film_softプリセット、自分の.cubeLUTをimport_assetで読み込んでからlutで適用する操作に対応しています。 -
部分調整(マスク使用)
「空だけを少し暗くして、地面はそのままにしてください。」
generate_maskでマスクを作成します(グラデーション、輝度範囲、色相範囲)。調整に組み込んだあと、overlay:"mask"を指定してrender_previewを実行すると、確定前に効果が適用される範囲を正確に確認できます。 -
レイヤー合成
「この写真のコピーをぼかして、スクリーンを50%で重ね、柔らかな光を加えてください。」
layersスタックを使い、16種類のブレンドモード、不透明度、マスクを組み合わせて、ソフトフォーカスなどの再現可能な合成を作成できます。 -
ウォーターマーク、レタッチ、遠近補正
「隅にロゴを入れて、電線を消し、収束した垂直線を補正してください。」
svg_overlayでロゴを焼き込み、clone/healでテクスチャとトーンを合成してシミや電線を除去し、perspectiveで収束した垂直線を補正します。 -
文書の読み取り(OCRの前処理)
「このレシートの写真を読んでください。」/「このスライドには何と書いてありますか?」
detect_documentでページや画面を検出し、そのまま貼り付けられるperspectiveの四隅座標を返します。ocr_documentプリセット(グレースケール、自動レベル補正、軽いシャープ処理)とtrimでテキストにピクセル数を集中させ、long_edge:1568を指定したrender_previewで、モデルが実際に読み取れる画像を渡します。OCRエンジンは同梱されていません。読み取りはモデルが行い、atxはピクセルを読みやすく、再現可能な状態に整えるだけです。detect_text_blocksは、残りの処理を決める「縮小後もこのテキストは読み取れるか、どこで切り取るか?」という問いに答えます。読み取り順のテキストブロックと、そのまま貼り付けられるcrop範囲を返します。外部OCRエンジン向けにはthreshold(Otsu/Sauvola)とocr_binarizeも用意されています。 -
検証と説明責任
「編集前と編集後の画像を並べて見せてください。」
compare_revisionsで編集前後を並べて表示するか、mean_abs_diffなどの統計情報を含む差分ヒートマップを返せます。すべてのリビジョンで系譜が保持されるため、記事で使用した画像の完全な編集履歴を追跡して再現でき、どのマシンでもバイト単位で同一の結果を得られます。 -
1枚のスキャン画像を複数の画像に分割
「台紙に貼った2枚のシートを1ページにスキャンしました。台紙を少し残して、それぞれ別ファイルで保存してください。」 分割操作はありません。同じソースリビジョンに対して、各部分ごとにモデルが
apply_transformを1回ずつ実行します(左右半分をcropしてから、紙の端に合わせてtrimし、台紙を少し残すためにpaddingを指定)。export_assetで両方をまとめて書き出します。まず座標を読み取るには、レシピを指定せずoverlay:"grid"を指定してrender_previewを実行します。
atxが行わない生成編集、RAW現像、MLベースの自動トリミング、OCR自体は対象外です。ロードマップについてはdocs/DESIGN.mdをご覧ください。
インストール
atx-mcp は、ランタイム依存関係のない単一の自己完結型バイナリです。以下から選択してください。
1. cargo binstall(ビルド済みバイナリ、コンパイル不要)
cargo binstall atx-mcp
claude mcp add --scope user asset-transform -- atx-mcp --workspace /path/to/asset-workspace
cargo-binstall は、コンパイルする代わりに、このリポジトリの CI でビルドされたリリースアーカイブをダウンロードするため、すでに Rust ツールチェーンをお持ちの方にとって最速の方法です。(--scope user を指定すると、すべてのプロジェクトでサーバーを利用できるようになります。省略すると、現在のプロジェクトのみで利用できます。)
2. cargo install(ソースからビルド)
cargo install atx-mcp
ビルド済みバイナリがない環境を含め、Rust ツールチェーンがサポートするすべてのプラットフォームで動作します。C コンパイラーも必要です(libwebp はベンダー提供のソースからビルドされます)。
3. ビルド済みバイナリ(Rust ツールチェーン不要)
インストーラースクリプト(既定のインストール先は ~/.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
4. Docker
ghcr.io/gridhra/atx-mcp は、静的リンクされたバイナリだけを格納した FROM scratch イメージです(linux/amd64 と linux/arm64)。
claude mcp add asset-transform -- \
docker run -i --rm -v "$PWD:/workspace" ghcr.io/gridhra/atx-mcp:0.6.7
留意点が 2 つあります。-i は必須です。サーバーは MCP の stdio トランスポートを使用するため、stdin を開いたままにする必要があります。また、パスはコンテナ内のパスです。バインドマウントしたディレクトリはコンテナ内で /workspace として表示されるため、import_asset と export_asset にはホスト側のパスではなく、/workspace/photos/shot.jpg のようなパスを指定します。
5. npx(Node.js 18 以降、インストール不要)
お使いのプラットフォーム向けのビルド済みネイティブバイナリは、optionalDependencies を通じて自動的に取得されます。
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"]
}
}
}
--workspace(環境変数:ATX_WORKSPACE)は、アセットストアとして使用するディレクトリです。存在しない場合は自動的に作成されます。
--max-concurrent-tools(環境変数:ATX_MAX_CONCURRENT_TOOLS)は、同時に実行するピクセル処理ツールの呼び出し数(import / inspect / detect_* / apply / preview / compare / mask)を制限します。既定値は CPU の数です。メモリに制約のあるホストでは、値を小さくしてください。ツールの処理は専用スレッドで実行されるため、画像の処理中も stdio トランスポート(ping、キャンセル、語彙ツール)は応答性を保ちます。
ツール(13)
| ツール | 役割 |
|---|---|
list_operations | レシピの語彙を簡潔に一覧表示します。すべての操作について、1行の説明と簡潔なパラメーターのヒントを示し、組み込みのプリセット名も表示します。任意の category:"geometry"|"color"|"filter"|"output" を指定すると、結果を絞り込めます(読み取り専用) |
explain_operation | 1つの操作の詳細リファレンスです。パラメーターの表(型、範囲、必須かどうか/デフォルト値、意味)、そのまま貼り付けられる JSON の例、注意点を示します。組み込みのプリセット名も指定でき、その操作リスト全体を返します。不明な名前を指定した場合は、有効な操作とプリセットをグループ別に返します(読み取り専用) |
import_asset | ローカル画像をワークスペースにインポートします(sha256 による冪等処理)。単一ファイルの場合は path、最大64件の一括処理の場合は paths を指定します(1つのファイルで失敗してもバッチ処理は中止されません)。画像のバイト列がこのワークスペース内のレシピの出力とすでに一致する場合は、already_derived_from で警告します |
inspect_image | 画像の寸法、EXIF の概要、ICC プロファイル、GPS データの有無、輝度統計、sharpness スコア(ラプラシアンの分散による値で、相対的な指標です。同じ被写体を撮影した既知の良好な画像と比較してください)、および「同じ画像かどうか」の判定に使える perceptual_hash(dHash、16桁の16進数)を調べます。include_exif:true を指定すると、すべての EXIF フィールドを {ifd, tag, value} エントリーとして追加で返します。完全なダンプには GPS 座標や名前が含まれる可能性があるため、デフォルトでは無効です(読み取り専用) |
detect_tilt | Canny+Hough による大まかな推定と、射影プロファイルによる0.1°未満の精密な調整で、傾き角度を推定します。水平/垂直方向の線群の推定値も返します。完全なスコア曲線は include_score_curve:true を指定すると取得できます。信頼度が低い場合は「補正しない」と返します(読み取り専用) |
detect_document | Canny + 輪郭検出により、主要な四角形(ページ、画面、ホワイトボード、看板)を検出し、perspective 対応の quad(tl、tr、br、bl)、confidence、area_ratio、output_size_hint、そのまま貼り付けられる suggested_operation を返します。推測で補わず、理由(no_quad_found/already_rectified/low_confidence)とともに quad:null を返します(読み取り専用) |
detect_text_blocks | Otsu 二値化 + ランレングススミアリング + 連結成分分析により、見出し、段落、表、キャプションなどのテキストらしいブロックを読み順に検出します。各ブロックについて line_count、median_line_height_px、ink_ratio を返します。legibility.line_height_at_1568_px では、長辺を1568に縮小したときにテキストが判読可能な状態で残るかどうかを示します(約16px未満では通常、判読できません)。legibility.recommended_bands は、この基準を満たす水平帯に画像を分割します。各エントリーは、render_preview の前に貼り付けられる crop 操作になっています(読み取り専用) |
generate_mask | 参照画像と同じ寸法の PNG リビジョンとして、決定論的なグレースケールマスク(linear_gradient/radial_gradient/luminosity_range/color_range)を生成します。操作の mask フィールドから参照できます(冪等) |
render_preview | レシピ(または preset)を低解像度で適用し(デフォルトでは長辺 ≤768、ビジョンモデルに判読可能なページを渡す場合は long_edge 256..1568)、インライン画像として返します。overlay:"grid"|"thirds"|"horizon" は構図ガイド線を重ね、overlay:"mask"(mask_revision_id と併用)はマスクの適用範囲を色付けします(プレビュー上にのみ描画され、実際の変換には影響しません)。返される画像の概算予算 width*height/750 である estimated_vision_tokens も報告します |
apply_transform | レシピ(または preset)をフル解像度で適用し、新しいリビジョンを作成します(同じレシピからは常に同じリビジョンが生成されます)。1枚の画像には revision_id、最大64件を一括処理する場合は revision_ids を指定します |
compare_revisions | 2つのリビジョンを長辺 ≤640 に縮小し、layout:"side_by_side"|"stacked" で配置した比較用のインライン画像(A/B 比較や変換前後の比較)として返すか、layout:"diff" でピクセル差分のヒートマップ1枚と mean_abs_diff/max_abs_diff/changed_pixel_ratio、および ssim スコアを返します(寸法が同じである必要があります)。どのレイアウトでも perceptual_hash_distance が報告されます。これは2つの dHash 値のハミング距離です(≤5なら通常は同じ画像の再エンコードまたはリサイズ、≥20なら異なる画像です) |
list_assets | リビジョン台帳を読み取ります(読み取り専用) |
export_asset | リビジョンをワークスペース外に書き出します。単一ファイルには revision_id + dest_path、最大64件の一括処理には revision_ids + dest_dir を指定し、filename_template(デフォルトは "{revision_id}.{ext}"、{index}/{stem} も使用可能)に基づいて名前を付けます。既存ファイルは 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 }
]
}
サポートされている操作(29 種類):auto_orient / rotate / perspective / crop(crop、
pad)/ trim / resize(cover、contain、fill)/ adjust / color_matrix /
curves / levels / lut / white_balance / hsl / blur / median /
unsharp_mask / convolve / threshold / 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 は画像ではなくアセットです。まずインポートしてから、
生成されたリビジョンをレシピで指定します。
.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はサイズがないことを示します。viewBoxも、ルートの<svg>に絶対値の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 値が使われます。
SVG 内のテキスト
atx はシステムフォントを読み込みません。インストールされているフォントはマシンごとに
異なるため、バイト単位での再現性が損なわれるからです。そのため、要求しない限り
<text> はスキップされます。
{ "op": "svg_overlay", "svg_revision_id": "rev_...", "x": 120, "y": 80,
"width": 48, "render_text": true, "font_revision_ids": ["rev_..."] }
render_textのデフォルトはfalseです。これにより、従来の動作がそのまま維持されます (図形は描画されますが、文字は描画されず、結果には警告が付加されます)。ベクター エディターでテキストをパスに変換する方法も引き続き使え、フォントは不要です。render_text:trueを指定すると、同梱フォントの Roboto Regular 1 種類 (バイナリに埋め込み済み)に加え、font_revision_idsで渡したフォント(最大 4 種類) を使ってテキストを描画します。それ以外のフォントは読み込まれないため、どのマシンでも 出力は同一になります。- フォントは LUT や SVG と同様のアセットです。
.ttf/.otfファイルをimport_assetすると、概要にfont-familyに記述するファミリー名が表示されます。 日本語やその他の CJK テキストには、インポートしたフォントが必要です。 Roboto には CJK の字形がなく、読み込まれたすべてのフォントに存在しない文字は 四角形で描画され、警告にその数が記録されます。意図的にinspect_imageでは フォントのリビジョンを扱えません。画像ではなくアセットのためです。
マスク(局所調整)
マスクはグレースケール画像の編集です。BT.709 輝度が重みとなり、白は「この操作を最大強度で適用する」、黒は「ピクセルを変更しない」を意味します。14 種類のトーン/フィルター操作(adjust、color_matrix、curves、levels、hsl、lut、white_balance、blur、median、unsharp_mask、convolve、grain、gradient_map、auto_levels)のいずれもマスクを受け付けます。
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(追加の角度) | 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)は、現在の画像のピクセル単位で指定したガウスのシグマを使ってマスクの境界をぼかします。
overlay:"mask"およびmask_revision_idを指定してrender_previewを実行すると、重みが 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)で、レイヤーをその下のレイヤーに合成する方法を制御します。- ブレンドモードは W3C の 16 種類から選択します。分離可能な 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"}を呼び出してください。
プリセット
プリセットは、レシピ内に単一の操作として直接記述することもできます({"op": "preset", "name": "ocr_document"})。これにより、名前付きのルックを独自の操作と組み合わせられます。マクロは処理開始前にその場で展開されるため、レシピのハッシュはプリセットの操作を手動で記述した場合とまったく同じになります。layers を含むプリセットは直接記述できず、構造化エラーになります。ルールを確認するには、explain_operation {"operation":"preset"} を呼び出してください。
apply_transform と render_preview では、recipe(未加工の DSL)または preset(crates/atx-mcp/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 | 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 | 赤フィルターをシミュレートした白黒(空を暗くするクラシックな効果) |
| 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 opとの併用を推奨) |
| 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 | 大きなヒーロー/バナー画像:2400px以内に収めて、WebP q85で出力します |
| building block | soft_vignette | 単独で使える控えめなビネット。他のルックの後に重ねる用途です |
| building block | grain_fine | 単独で使える軽く細かな決定的粒子感。重ねて使う用途です |
| ocr | ocr_document | ページ、スライド、ホワイトボードの写真をビジョンモデルで読みやすくします:グレースケール、自動レベル補正、軽いシャープ処理(二値化なし) |
| ocr | ocr_receipt | ノイズの多い、または色あせたレシート向け:グレースケール、メディアンノイズ除去、強めの自動レベル補正、シャープ処理 |
| ocr | ocr_binarize | 外部OCRエンジン向けのSauvola適応的二値化(ビジョンモデルで結果を読み取る場合はocr_documentを推奨) |
| ocr | ocr_dark_ui | ダークモードのスクリーンショット向け:余白をtrimしてから、暗い部分を明るくしたグレースケールに反転します |
プリセットは糖衣構文にすぎません。レシピに展開されて通常のパイプラインで処理され、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 サーバー)。
3 つのライブラリは、atx-core が無関係なプロジェクトとして使われているため、より長い名前で crates.io に公開されています。
| ディレクトリ | 公開名 | コード内のライブラリ名 |
|---|---|---|
crates/atx-core | asset-transform-core | atx_core |
crates/atx-geometry | asset-transform-geometry | atx_geometry |
crates/atx-store | asset-transform-store | atx_store |
crates/atx-mcp | atx-mcp | atx_mcp(バイナリ atx-mcp) |
したがって、変換エンジンをライブラリとして使うには、asset-transform-core = "0.6.7" に依存関係を追加し、use atx_core::… と記述してください。
名前
「atx」は Asset Transform の略です。末尾の x は、よく使われる「transform」の略記(xform や tx など)に倣っています。短く入力しやすいバイナリ名とディレクトリの接頭辞(crates/atx-core など)として選ばれました。PC の ATX フォームファクターや Markdown の ATX 形式の見出しとは関係ありません。crates.io のパッケージ名では、名前を完全な形で表記しています(asset-transform-core など)。
ライセンス
MIT。LICENSE を参照してください。
バイナリに同梱されるクレート以外の素材(バンドルされている Roboto Regular フォント)は、出典とライセンスを THIRD_PARTY_NOTICES.md に記載しています。
atx-mcp が時間の節約に役立ったら、コーヒーをおごってください ☕
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。