Skip to main content
Glama

atx-mcp

English | 日本語 | 简体中文

범용 AI 에이전트를 위한 결정적(deterministic) (비생성적) 에셋 변환 MCP 서버로, Rust로 작성되었습니다.

편집 의도 — "지평선을 수평으로 맞추고, 16:9로 크롭하고, 살짝 밝게" — 를 선언적 변환 레시피로 실행하며, 모든 결과를 불변 리비전으로 추적합니다. 원본 에셋은 절대 수정되지 않습니다.

편집 전/후: 기울어진 합성 도시 풍경이 수평으로 펴지고, 레벨이 자동 보정되었으며, 미묘한 룩이 적용됨 틸트 보정 + 자동 레벨 + 룩 적용(완전히 결정적인 레시피) — 왼쪽: 입력 / 오른쪽: 출력.

전체 설계에 대해서는 docs/DESIGN.md를 참조하세요.

사용 사례

  1. 기사용 아이캐치 이미지

    "이 사진을 수평으로 맞추고 16:9, 1600px 아이캐치로 크롭해 줘. WebP로." import_asset → detect_tilt(이미 수평에 가까우면 AI가 보정을 건너뜀) → apply_transform(rotate → crop → resize → encode) → export_asset. 원본은 절대 건드리지 않으며, 동일한 레시피는 항상 동일한 결과를 재현합니다.

  2. 소셜/CMS용 여러 크기

    "이 사진의 OGP, 인스타그램 정사각형, 썸네일 버전을 생성해 줘." 하나의 원본이 OGP 1200×630, 인스타그램 1080 정사각형, 400px 썸네일로 병렬로 분기됩니다. 동일 레시피-동일 리비전 멱등성 덕분에 다시 실행해도 출력이 중복 생성되지 않으며, 한 단어 프리셋 이름도 사용할 수 있습니다.

  3. 게시해도 안전

    "위치 데이터는 반드시 제거하되, 색상은 건드리지 마." strip_metadata(exif)는 GPS를 포함한 EXIF를 제거하면서 ICC 프로파일은 유지합니다. AI는 inspect_image의 has_gps를 확인하여 사전에 경고할 수도 있습니다.

  4. 색상 및 룩 조정

    "하늘만 더 파랗게 만들고, 나머지는 그대로 둬." curves / levels / hsl / white_balance, film_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는 편집 전/후를 나란히 배치하거나, mean_abs_diff 같은 통계가 포함된 차이 히트맵을 반환합니다. 모든 리비전은 계보를 유지하므로, 기사에 사용된 모든 이미지의 전체 편집 이력을 추적하고 재현할 수 있습니다. 어떤 머신에서든 바이트 단위로 동일합니다.

atx가 하지 않는 작업 — 생성적 편집, RAW 현상, ML 기반 자동 크롭 — 은 범위 밖입니다. 로드맵은 docs/DESIGN.md를 참조하세요.

Related MCP server: roundcut-mcp

설치

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

수동으로 다운로드하려면 릴리스에서 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_operatons

레시피 어휘의 간결한 카탈로그: 각 작업에 대한 한 줄 설명과 간결한 매개변수 힌트, 그리고 내장 프리셋 이름을 제공합니다. 선택적으로 categry:"geometr"|"colr"|"fiter"|"outut"로 범위를 좁힐 수 있습니다(읽기 전용)

explain_operaton

한 작업에 대한 전체 참조: 매개변수 표(유형, 범위, 필수/기본값, 의미), 바로 붙여넣을 수 있는 JSON 예제와 주의사항. 내장 프리셋 이름도 사용할 수 있으며 전체 작업 목록을 반환합니다. 알 수 없는 이름은 유효한 작업과 프리셋을 그룹별로 반환합니다(읽기 전용)

imort_asset

로컬 이미지를 워크스페이스로 가져옵니다(sha256 멱등). 파일 하나는 path, 최대 64개 배치는 paths를 사용합니다(실패한 파일이 배치를 중단하지 않음). 바이트가 이미 이 워크스페이스의 레시피 출력인 경우 already_derived_from을 통해 경고합니다

insect_image

크기, EXIF, ICC 프로파일, GPS 데이터 존재 여부 등을 검사합니다(읽기 전용)

detect_tilt

Canny+Hough(대략)와 프로젝션 프로파일(0.1° 미만 정밀 보정)로 기울기 각도를 추정합니다. 가로/세로 계열 추정치도 반환하며, 전체 점수 곡선은 include_score_curve:true를 통해 선택적으로 받을 수 있습니다. 신도가 낮으면 "보정하지 않음"을 반환합니다(읽기 전용)

generate_mask

참조 이미지와 동일한 크기의 PNG 리비전으로 결적 그레이스케일 마스크(linear_gradient / radial_gradient / luminosity_range / color_range)를 생셩하며, 작업의 mask 필드에서 참조할 수 있습니다(멱등)

render_preview

레시피(또는 preset)를 낮은 해상도(긴 변 ≤768)로 적용하고 인라인 이미지로 반환합니다. overlay:"grid"|"thirds"|"horizon"는 구도 가이드 선을 오버레이하고, overlay:"mask"(mask_revision_id 포함)는 마스크 적용 범위에 색조를 입힙니다(미리보기에만 표시되며 실제 변환에는 영항을 주지 않음)

apply_transform

레시피(또는 preset)를 전체 해상도로 적용하여 새 리비전을 생셩합니다(같은 레시피는 항상 같은 리비전을 산출). 하나의 이미지는 revision_id, 동일한 레시피를 최대 64개 배치에 적용하려면 revision_ids를 사용합니다

compare_revisions

두 리비전을 긴 변 ≤640으로 축소한 뒤 단일 인라인 이미지로 합성하여 반환합니다. layut:"side_by_side"|"stacked"( A/B 및 전후 비교용)로 배치하거나, layut:"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_matix / curves / leves / lut / white_balance / hsl / blur / median / unsharp_mask / convolve / clone / heal / svg_overlay / flip / vignette / grain / gradient_map / pixelate / auto_leves / encode (jpeg, png, webp, avif) / strip_metadata.

작업 어휘는 의도적으로 도구 스키마에서 제외되어 있습니다. 최신 카탈로그는 list_operations를, 특정 작업의 전체 스키마, 예제 및 주의사항은 explain_operation을 호출하세요.

LUT (.cube)

.cube 3D/1D LUT는 이미지가 아니라 에셋입니다. 먼저 가져온 다음, 그 결과로 생성된 리비전을 레시피가 가리키게 하세요.

  1. import_asset으로 .cube 파일을 가져옵니다. 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. import_asset으로 .svg 파일을 가져옵니다. 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는 파이프라인의 그 시점에서 이미지 좌표 기준 오버레이의 왼쪽 위 모서리입니다(그러므로 리사이즈/크롭 후에 오버레이를 배치하세요). 음수 값도 허용되며 넘치는 부분은 잘립니다. 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) 중 하나가 마스크를 받습니다.

  1. generate_mask는 참조 이미지를 기준으로 해당 이미지의 치수와 정확히 일치하는 마스크를 결정적으로 생성합니다.

kind

Parameters

What it selects

linear_gradient

angle_degrees (0 = 위쪽이 흰색이며 아래로 갈수록 흐려짐, 양수 = 시계 방향), start, end (가중치가 1→0이 되는 축 상의 0..1 위치)

그라데이션 필터 (하늘, 전경)

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. 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)는 레이어가 그 아래 레이어에 합성되는 방식을 제어합니다.

  • 블렌드 모드는 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

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 작업과 함께 사용)

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

단독으로 쓰는 가볍고 미세하며 결정적인 그레인, 쌓기용

프리셋은 순전한 문법 설탕입니다. 프리셋은 자신의 레시피로 해석되어 일반 파이프라인을 그대로 통과하며, recipe_hash(멱등성 키)는 해석된 레시피를 기준으로 계산됩니다. 따라서 프리셋 호출과 동등한 원시 레시피는 동일한 리비전에 도달합니다.

보장

  • 결정적(Deterministic): 동일한 입력 + 동일한 레시피는 항상 바이트 단위로 동일한 출력을 생성합니다(골든 테스트로 회귀 검증됨)

  • 멱등(Idempotent): 레시피는 정규화되고(키 정렬, f64 값은 1e-6 그리드로 양자화) sha256으로 해시됩니다. (input revision, recipe hash)가 기존 쌍과 일치하면 새 리비전 대신 기존 리비전이 반환됩니다

  • 원본은 보호됩니다: 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가 시간을 절약해 준다면 커피 한 잔 사주세요 ☕

Available Tools

13 tools
apply_transformA
Idempotent

Apply a transform recipe at full resolution and issue a new revision. Pass either recipe ({"operations": [...]}, applied in order, at most one "encode" and it must be last) or preset (a built-in named recipe) - exactly one of the two - and either revision_id (one image) or revision_ids (the same recipe over a batch of up to 64; one failure does not abort the rest). Call list_operations for the operation catalog and the preset names, explain_operation for one operation's full schema. Idempotent: the same (revision_id, resolved recipe) returns the existing derived revision; a preset hashes identically to the equivalent raw recipe. Note: if the recipe's encode format is png, webp, or avif, any ICC color profile on the source is dropped (embedding is only supported for jpeg output); this is reported as a warning, not an error.

NameRequiredDescriptionDefault
presetNoビルトインプリセット名(`list_operations` の presets セクション参照)。 指定するとそのプリセットのレシピが使われる。`recipe` とは排他。
recipeNo変換レシピ。`{"operations": [...]}`。`preset` とはどちらか一方のみ指定する。
revision_idNo入力 revision ID("rev_...")。`revision_ids` とは排他で、どちらか一方が必須。
revision_idsNo同じレシピを複数 revision に適用する(1..=64 件)。`revision_id` とは排他。 1件が失敗してもバッチは中断せず、その要素に error が入る。

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses meaningful behavioral traits: idempotent behavior with existing derived revisions, preset-to-recipe hash equivalence, ICC color profile dropping for certain encode formats, and warning-as-not-error semantics. It also clarifies that a new revision is issued. This goes well beyond what readOnlyHint, destructiveHint, and idempotentHint already communicate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is packed with essential information but remains well-structured and front-loaded with the core purpose. Each sentence contributes unique value: input constraints, sibling tool pointers, idempotence, and an edge-case warning. No filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex transform tool, the description covers input selection, mutual exclusivity, batch behavior, idempotence, encoding caveats, and where to find operation catalog details. An output schema exists, so return-value details need not be duplicated. The description is complete enough for an agent to call the tool correctly in both single and batch scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema description coverage is 100%, the description adds critical parameter semantics not encoded in the schema: recipe structure with operations applied in order, at most one encode operation and it must be last, the exact one-of relationship, batch size limit of 64, and per-item failure isolation. The note about ICC profile behavior further clarifies the recipe parameter's practical effects.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: 'Apply a transform recipe at full resolution and issue a new revision.' It clearly distinguishes this from siblings like render_preview and export_asset by emphasizing full-resolution processing and revision creation. The operation's core input alternatives are also stated, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: exactly one of recipe/preset and exactly one of revision_id/revision_ids, plus batch limits and failure semantics. It also points to sibling tools list_operations and explain_operation for prerequisite knowledge. However, it does not explicitly state when not to use this tool versus siblings like render_preview, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_revisionsA
Idempotent

Scale two revisions to a long edge of 640px each and compose them on one canvas (side by side, or stacked) with an 8px gap, returned inline as a JPEG. A is placed left/top, B is placed right/bottom. Useful for before/after or A/B visual checks. layout="diff" instead requires A and B to share the exact same dimensions and returns a single pixel-difference heatmap plus mean_abs_diff/max_abs_diff/changed_pixel_ratio and an ssim score (structural similarity, 1.0 = identical). Every layout also reports perceptual_hash_distance: the Hamming distance between the two dHash values (0..=64), where 5 or less usually means the same picture re-encoded or resized and 20 or more means two different pictures.

NameRequiredDescriptionDefault
layoutNo`"side_by_side"`(既定、水平に並べる)| `"stacked"`(垂直に並べる)| `"diff"`(並べる代わりに1枚の差分ヒートマップを作る。A/B の寸法が完全一致している必要がある)。side_by_side
revision_id_aYes比較対象 A の revision ID("rev_...")。合成画像の左(または上)に置かれる。
revision_id_bYes比較対象 B の revision ID("rev_...")。合成画像の右(または下)に置かれる。

Output Schema

NameRequiredDescription
aYes
bYes
ssimNoStructural similarity (SSIM, 0..=1) over the two images' luma. Present only with `layout: "diff"` and equal dimensions. 1.0 is pixel-identical; above ~0.98 the difference is usually invisible; below ~0.9 it is a visible change of content.
widthYes合成画像(比較プレビュー)の寸法・容量。
heightYes
layoutYes
byte_sizeYes
mime_typeYes
a_positionYesA が合成画像のどこに置かれるか("left" | "top")。
b_positionYesB が合成画像のどこに置かれるか("right" | "bottom")。
max_abs_diffNo`layout: "diff"` のときだけ載る: 画素ごとのチャンネル最大絶対差 d の、全画素中の最大値。
preview_pathYes比較プレビュー画像の絶対パス。
mean_abs_diffNo`layout: "diff"` のときだけ載る: 全チャンネル・全画素平均の絶対差(0..255 スケール)。
changed_pixel_ratioNo`layout: "diff"` のときだけ載る: d > 2 の画素が全体に占める割合(0.0..=1.0)。
perceptual_hash_distanceNoHamming distance (0..=64) between the two revisions' perceptual hashes (dHash), on every layout. 0 means the thumbnails are identical; 5 or less usually means the same picture re-encoded or resized; 20 or more means different pictures. Null when either side's pixels could not be hashed.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations covering safety, the description adds substantial behavioral detail the annotations cannot: the 640px scaling, 8px gap, A/B placement order, JPEG inline return, diff's dimension precondition, and how to interpret perceptual_hash_distance thresholds. This is rich context beyond structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core behavior, then layers diff and metric semantics. Dense and mostly earning its length, though the metric-threshold sentences could be trimmed without losing the essential call information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter compose tool with an output schema, the description covers layout semantics, output format, preconditions, and metric interpretation. Nothing an agent needs to invoke or interpret it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning: it explains which layout is default, the placement convention (A left/top, B right/bottom), and the semantic thresholds for the computed distance metrics, going beyond the schema's field docs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific actions (scale to 640px, compose on one canvas, return JPEG) with a precise resource (two revisions), and it explicitly distinguishes its three layouts including what diff does differently. An agent can tell exactly what this produces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the trigger context ('useful for before/after or A/B visual checks') and the precondition that diff requires identical dimensions. It does not name or contrast sibling tools, but the when-to-use conditions are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detect_documentA
Read-onlyIdempotent

Detect the dominant quadrilateral (a sheet of paper, a screen, a whiteboard, a sign) in a revision with a contour-based search, and return it as a ready-to-paste perspective operation. This is to perspective what detect_tilt is to rotate: read-only, it never modifies the image, and a null quad means "do not correct". The quad is in post-EXIF-orientation pixel coordinates, ordered tl, tr, br, bl, and output_size_hint is exactly the size perspective will produce from it. Optional min_area_ratio (0.05..=1.0, default 0.2) is the smallest fraction of the frame a candidate may cover. When quad is null the reason is the first warning: no_quad_found, already_rectified (the page already fills the frame) or low_confidence.

NameRequiredDescriptionDefault
revision_idYes対象 revision ID("rev_...")。
min_area_ratioNo画像面積に対する候補四角形の最小面積比(0.05..=1.0)。省略時は 0.2。

Output Schema

NameRequiredDescription
detectionYes検出結果。`quad` が null なら「補正しない」で、理由は `warnings` の先頭に入る。
revision_idYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavior beyond that: coordinate ordering (tl, tr, br, bl), post-EXIF-orientation coordinates, output_size_hint semantics, min_area_ratio constraints, and the exact warning reasons when quad is null. This is rich, non-redundant behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each earning its place: purpose and analogy, coordinate/output semantics, and parameter/warning behavior. It front-loads the core action and keeps supporting details compact, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the annotations, full schema coverage, and presence of an output schema, the description covers everything an agent needs: operation type, coordinate system, ordering, output sizing, parameter defaults, and failure/warning semantics. No important calling decision is left unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, so the baseline is 3. The description still adds meaning to min_area_ratio as 'the smallest fraction of the frame a candidate may cover', and clarifies that output_size_hint matches what perspective will produce. It does not add much to revision_id, but that is already well covered by the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Detect the dominant quadrilateral ... in a revision with a contour-based search', and clarifies the return as a 'ready-to-paste perspective operation'. It also distinguishes itself from sibling detect_tilt by drawing the perspective/rotate analogy, so an agent can tell what this tool uniquely does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives strong context: it is read-only, never modifies the image, and a null quad means 'do not correct'. It also relates the tool to perspective via detect_tilt, which implies when to use it. It does not spell out explicit exclusion cases or name more alternatives, so it stops short of the strongest possible guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detect_text_blocksA
Read-onlyIdempotent

Find the text-like blocks (headline, paragraphs, table, caption) of a revision with a binarize + run-length smearing + connected-components pass, and report whether the text will survive a preview downscale. Read-only: it never modifies the image. Blocks come back in reading order (top to bottom, then left to right) in post-EXIF-orientation pixel coordinates, each with its line_count, median_line_height_px and ink_ratio. legibility.line_height_at_1568_px is the median line height once the whole image is shrunk to long edge 1568 (below ~16 the text is usually unreadable), and legibility.recommended_bands splits the image into crops that clear that bar - each entry is already a crop operation, so paste one into a recipe before render_preview long_edge: 1568 and read them in order. legibility.strategy says how it split: "whole" (no split needed), "bands" (full-width horizontal bands) or "blocks" (per-block crops, used when the image is too wide for full-width bands to help). Optional max_blocks (1..=128, default 32) and min_block_area_ratio (0.0..=1.0, default 0.00005) bound how many and how small the blocks may be. No block found means the image has no text-like structure, not an error.

NameRequiredDescriptionDefault
max_blocksNo返すブロック数の上限(1..=128)。省略時は 32。
revision_idYes対象 revision ID("rev_...")。
min_block_area_ratioNo作業画像面積に対する 1 ブロックの最小面積比(0.0..=1.0)。 これ未満の成分はノイズとして捨てる。省略時は 0.00005。

Output Schema

NameRequiredDescription
detectionYes検出結果。ブロックが無ければ `blocks` は空で `warnings` に理由が入る。
revision_idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description reinforces this plus adds behavior annotations do not cover: output ordering (reading order, post-EXIF pixel coordinates), the ~16px legibility threshold, the three splitting strategies, and the important guarantee that 'no block found' is not an error. Missing only things like performance or image-size limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the read-only guarantee are front-loaded, and each dense sentence carries information. There is mild redundancy: the read-only statement repeats the annotation, and the enumeration of returned fields partially duplicates the available output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only analysis tool with full annotations and an output schema, the description supplies the missing pieces an agent needs: orientation/coordinate conventions, legibility semantics, and how to chain the recommended_bands into render_preview. Spending text on individual return fields is somewhat redundant given the output schema, but nothing essential is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both optional params are already documented in the schema, so the baseline is 3; the description earns an extra point by stating the intent behind them ('bound how many and how small the blocks may be') rather than only restating ranges.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Find the text-like blocks ... of a revision') and even names the algorithm (binarize + run-length smearing + connected components), which cleanly separates it from sibling detectors like detect_document and detect_tilt. An agent can identify the tool's job from the first clause alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete workflow context: use it to check whether text survives a preview downscale, then paste an entry from legibility.recommended_bands into a recipe before render_preview with long_edge: 1568. It does not, however, state when NOT to use it versus detect_document/detect_tilt, so it stops short of explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detect_tiltA
Read-onlyIdempotent

Detect the tilt (roll) of a revision: Canny + Hough dominant lines for coarse candidates, refined below 0.1 degree with an edge projection-profile search. Horizontal-only and vertical-only estimates are reported separately so a disagreement can be read as perspective/camera position rather than roll, Set include_score_curve=true to also get the whole search range as a score curve (omitted by default to keep the answer small). Read-only: it never modifies the image. A null recommended angle means "do not correct".

NameRequiredDescriptionDefault
revision_idYes対象 revision ID("rev_...")。
max_abs_angleNo探索する最大傾き角(度、0.5..=45)。省略時は 15。
include_score_curveNo探索範囲全体のスコア曲線(最大 300 点)を結果に含めるか。既定 false。 ピークの鋭さ・多峰性を自分で読みたいときだけ true にする(既定では省かれる)。

Output Schema

NameRequiredDescription
detectionYes検出結果。`score_curve` は `include_score_curve: true` のときだけ載る。
revision_idYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/idempotentHint annotations, the description explicitly says it never modifies the image, describes processing stages (Canny/Hough then projection-profile refinement), discloses response-size behavior (score curve omitted by default), and defines the null recommended-angle sentinel. This gives an agent strong expectations for side effects and outputs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and method, and each clause adds useful context. It is slightly dense and contains a minor punctuation issue ('roll,' followed by 'Set'), but no sentence is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering safety/idempotency, the description supplies the remaining operational context: algorithm, default response size, read-only behavior, and the meaning of null. An agent has enough to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already explains revision_id, max_abs_angle, and include_score_curve. The description reinforces include_score_curve's behavior and adds 'to keep the answer small', but it contributes little beyond the schema and does not deepen revision_id or max_abs_angle semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening states a specific verb and resource: 'Detect the tilt (roll) of a revision' rather than a generic or tautological phrase. It also details what the tool returns (horizontal-only and vertical-only estimates, optional score curve), so an agent can distinguish it from siblings like detect_document.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context is given: the tool is for measuring roll/tilt of a revision, and the description explains how to interpret disagreement between estimates and when to set include_score_curve=true. However, it does not explicitly name alternatives or state when not to use this tool versus siblings such as apply_transform or detect_document.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

explain_operationA
Read-onlyIdempotent

Full reference for one recipe operation: every parameter with its type, range, required/default status and semantics, one or two ready-to-paste JSON examples, and the gotchas worth knowing before using it. A built-in preset name works too and returns its full operation list, so a preset can be read and copied as a raw recipe. An unknown name returns a structured error listing every valid operation and preset. Read-only.

NameRequiredDescriptionDefault
operationYes説明したい op 名(`{"op": "..."}` に書く名前)。

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, but the description goes further: it states 'Read-only' explicitly, describes support for preset names, and explains the structured error response for unknown names listing all valid operations. This adds behavioral context beyond the annotations, covering error handling and preset behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is approximately 80 words, composed of three sentences. It front-loads the main purpose ('Full reference for one recipe operation'), then details content, presets, and errors. Reasonably concise and logically structured, though it could be slightly tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only reference tool with one parameter and an output schema, the description covers return content (parameters, examples, gotchas), preset handling, and error behavior (unknown names return a structured error with valid operations). All essential information for correct invocation is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, 'operation', has a schema description explaining it as the op name to write in the format {"op": "..."}. Schema description coverage is 100%, so the description adds no additional meaning about the parameter itself; it focuses on the return value. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Full reference for one recipe operation' with detailed content (parameters, examples, gotchas). It also covers preset handling and error behavior, distinguishing it from sibling tools like list_operations. The verb 'explain' and resource 'operation' are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for when detailed information about a specific operation is needed, contrasting with listing all operations. It does not explicitly name an alternative, but the context 'one recipe operation' and the error fallback listing all valid operations provide clear guidance. No explicit exclusions, but sufficient context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_assetA
Destructive

Copy revisions' bytes out of the workspace. Pass either revision_id + dest_path (one file) or revision_ids + dest_dir (a batch of up to 64 into one existing directory; one failure does not abort the rest) - exactly one of the two forms. For a batch, filename_template (default "{revision_id}.{ext}") builds each file name from {revision_id} / {index} (1-based, zero-padded) / {ext} (from the MIME type) / {stem} (the file name the lineage was imported from); it must be a plain file name, and if two entries would collide nothing is written. Refuses to overwrite an existing file unless overwrite=true (ask the user first), and never writes inside the workspace store or through a symbolic link.

NameRequiredDescriptionDefault
dest_dirNo書き出し先ディレクトリ(ワークスペース外、既存のディレクトリ)。 `revision_ids`(複数)専用。
dest_pathNo書き出し先パス(ワークスペース外)。`revision_id`(単数)専用。
overwriteNo既存ファイルを上書きしてよいか。既定 false(既存なら失敗する)。
revision_idNo書き出す revision ID("rev_...")。`revision_ids` とは排他で、どちらか一方が必須。
revision_idsNo複数 revision を1回で書き出す(1..=64 件)。`revision_id` とは排他。 このときは `dest_path` ではなく `dest_dir` を渡す。 1件が失敗してもバッチは中断せず、`failed` に理由が入る。
filename_templateNo`dest_dir` 内のファイル名の組み立て方。既定 `"{revision_id}.{ext}"`。 `revision_ids`(複数)専用。

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds behavioral detail beyond them: overwrite is refused by default, collision in a batch writes nothing at all, execution never targets the workspace store or a symlink, and partial batch failure is tolerated. These are non-obvious operational traits worth stating.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then constraints ordered by invocation path. Every clause carries a real constraint, though the dense parenthetical chains make it heavier to parse than a few shorter sentences would be. No filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the annotations carry the safety profile. Given the 6 parameters and the two-form invocation model, the description covers the exclusivity rule, defaults, failure behavior and write restrictions - nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already carries the baseline. The description goes further by pairing each form's parameters (revision_id + dest_path vs revision_ids + dest_dir), spelling out template placeholders ({revision_id}, {index} 1-based zero-padded, {ext} from MIME, {stem}) and the default template - meaning genuinely beyond what the structured fields convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Copy revisions' bytes out of the workspace') and names the exact scope: workspace bytes to an external path. It is naturally distinguishable from the inverse sibling import_asset and from list/inspect tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly declares the two mutually exclusive invocation forms ('exactly one of the two forms'), gives the batch cap (up to 64), notes that one failure does not abort the batch, and instructs the agent to ask the user before overwriting. This is full when/when-not guidance rather than implied context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_maskA
Idempotent

Generate a deterministic grayscale mask as a new PNG revision, with exactly the dimensions of reference_revision_id. kind is "linear_gradient" (angle_degrees, start, end), "radial_gradient" (center_x, center_y, radius, feather), "luminosity_range" (min, max, feather) or "color_range" (hue_center, hue_width, feather); the gradients use only the reference's dimensions, the other two compute weights from its pixels. White = the masked operation applies fully, black = not at all. Reference the returned revision_id from any tone/filter operation as "mask": {"revision_id": "rev_...", "invert": false, "feather_px": 0}, or visualise it with render_preview overlay="mask". Idempotent: the same params over the same reference produce byte-identical PNG bytes and return the existing revision.

NameRequiredDescriptionDefault
endNolinear_gradient: 軸上で重みが 0.0 に達する位置(0..1、`start` 以上)。既定 1.0。
maxNoluminosity_range: 完全に選択される輝度域の上限(0..255、`min` 以上)。既定 255。
minNoluminosity_range: 完全に選択される輝度域の下限(0..255)。既定 0。
kindYes`"linear_gradient"` | `"radial_gradient"` | `"luminosity_range"` | `"color_range"`。
startNolinear_gradient: 軸上で重みが 1.0 のままでいる終端位置(0..1)。既定 0.0。
radiusNoradial_gradient: 重みが 1.0 の内円の半径(対角線の半分に対する比 0..1)。既定 0.5。
featherNo減衰帯の幅。radial_gradient では対角線の半分に対する比(0..1、既定 0.25)、 luminosity_range では輝度単位(0..255、既定 16)、 color_range では色相の度数(0..180、既定 15)。linear_gradient では使わない (`start`/`end` の間隔がフェザそのもの)。
center_xNoradial_gradient: 中心の X(画像幅に対する相対値 0..1)。既定 0.5。
center_yNoradial_gradient: 中心の Y(画像高に対する相対値 0..1)。既定 0.5。
hue_widthNocolor_range: 中心からの**片側**幅(度、1..180)。既定 30。
hue_centerNocolor_range: 中心色相(度、0..360)。必須。
angle_degreesNolinear_gradient: グラデーション軸の角度(度)。0 = 上が白で下へ向かって黒、 90 = 左が白で右へ向かって黒(正の角度で時計回り)。既定 0。
reference_revision_idYes寸法(と、輝度/色域マスクでは画素)の供給元になる画像 revision ID。

Output Schema

NameRequiredDescription
kindYes生成した種別(`linear_gradient` 等)。
nextYes次の一手(op への参照の仕方)。
widthYes
heightYes
reusedYes同じマスクが既に生成済みで既存 revision を返した場合 true(冪等ヒット)。
revisionYes
generatorYes既定値まで解決したパラメータの正規化 JSON(origin の generator と同一文字列)。
mean_weightYesマスクの平均重み(0..1)。1 に近いほど広く、0 に近いほど狭い被覆。
reference_revision_idYes参照した画像 revision(寸法・画素の供給元)。

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond annotations by detailing the deterministic and idempotent behavior (same params produce byte-identical PNG and return existing revision). It also clarifies what the mask represents (white = full application, black = none) and that gradients use dimensions while ranges use pixels. The idempotentHint annotation is confirmed and expanded with specifics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence serves a purpose: it defines the function, parameter kinds, output semantics, usage example, and idempotency. The front-loaded summary of kinds is efficient, and the JSON usage example is compact yet informative. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (13 parameters, 4 kinds) and presence of output schema, the description covers key aspects: output semantics, idempotency, and usage integration. It omits explicit return value format (though output schema exists) and some edge cases, but the examples and schema descriptions cover most. The description is sufficient for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed descriptions for each parameter including default values and units. The description adds clarity by grouping parameters by kind and explaining the common semantics (like feather behavior) but does not add substantial new information beyond the schema. The description's parameter list matches the schema and provides complementary context (e.g., which parameters apply to which kind), but this is largely redundant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: generating a deterministic grayscale mask as a new PNG revision with exact dimensions from a reference. It enumerates four distinct mask kinds with their parametersholistic details, and explains the white/black semantics. This distinguishes it from siblings like render_preview or apply_transform by focusing on mask generation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains how to use the result: referencing the returned revision_id in tone/filter operations with a concrete JSON example, and how to visualize it with render_preview overlay. It does not explicitly mention when not to use it, but the detailed operation contracts and idempotency note provide clear context for typical use cases. The alternatives are implied by sibling tools, and the usage examples are sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_assetA
Idempotent

Import a local image file into the workspace and issue an immutable revision. Pass either path (one file) or paths (a batch of up to 64; one bad file does not abort the batch, it lands in failed) - exactly one of the two. Idempotent: importing the same bytes again returns the existing revision. If the imported bytes are already the output of a recipe held in this workspace, the result carries a warning plus already_derived_from so the same recipe is not applied twice.

NameRequiredDescriptionDefault
pathNo取り込むローカルファイルの絶対パス(または cwd からの相対パス)。 `paths` とは排他で、どちらか一方が必須。
pathsNo複数ファイルを1回で取り込む(1..=64 件)。`path` とは排他。 1件が失敗してもバッチは中断せず、`failed` に理由が入る。

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly=false, idempotent=true, destructive=false), the description discloses idempotency behavior ('same bytes returns the existing revision'), partial-batch failure behavior ('one bad file does not abort the batch, it lands in `failed`'), and a derived-output warning with `already_derived_from`. This is substantial behavioral context that the annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each carrying distinct information (purpose, selection rule, idempotency, derived-output warning), with the core purpose front-loaded. No filler or repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an import tool with an output schema present, the description need not explain return values, yet it still flags the meaningful outcome fields (`failed`, `already_derived_from`). Combined with the safety annotations, an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it resolves the ambiguity left by zero required parameters by asserting 'exactly one of the two' is required, and restates the 64-file batch cap and per-file failure model. That is genuine value over structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Import a local image file into the workspace') plus the notable side effect ('issue an immutable revision'). This is clearly distinct from siblings like export_asset and list_assets. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the operational context clearly: use `path` for one file or `paths` for a batch, exactly one of the two, and describes the batch-failure semantics. It does not name a sibling alternative or state when-not to use (e.g., directory vs file, remote URLs), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_imageA
Read-onlyIdempotent

Inspect a revision: dimensions, MIME type, byte size, alpha/ICC presence, EXIF orientation and summary, whether GPS (PII) metadata is present, luma statistics, a sharpness score (variance of the Laplacian - relative, so compare it against a known-good capture rather than an absolute; for documents below ~30 usually means motion blur or defocus) and a perceptual_hash (dHash, 16 hex digits) for telling "is this the same picture?" without comparing pixels. Set include_exif=true to also get every EXIF field as {ifd, tag, value} entries; it is off by default because the full dump can carry GPS coordinates and names.

NameRequiredDescriptionDefault
revision_idYes対象 revision ID("rev_...")。
include_exifNoEXIF 全フィールドを `info.exif` に載せるか。既定 false。 既定で落としているのはプライバシーのため: 全量には GPS 座標や 個人名が入りうるので、明示的に要求されたときだけ返す (`exif_summary` と `has_gps` は従来どおり常に載る)。

Output Schema

NameRequiredDescription
infoYes
pathYes
revision_idYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the description's added value is the interpretation detail: sharpness is a relative Laplacian variance (below ~30 usually means motion blur or defocus), perceptual_hash is a dHash for identity checks, and include_exif is off by default because full EXIF can carry GPS coordinates and names. That privacy and interpretation context goes beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences that front-load the enumeration and end with the opt-in flag's rationale. Every clause carries information, though the output enumeration is long enough that it slightly blurs the primary purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still adds interpretive value the schema cannot (sharpness scale, dHash semantics) and explains the include_exif default. For a read-only, non-destructive, idempotent inspection tool, an agent has everything needed to invoke and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents revision_id and include_exif including the privacy rationale. The description restates the include_exif default and its reason without adding syntax or format detail beyond the structured field, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a concrete verb (Inspect) and resource (revision/image) and enumerates the exact attributes produced: dimensions, MIME type, byte size, alpha/ICC, EXIF orientation, GPS presence, luma stats, sharpness, perceptual_hash. This clearly separates it from siblings like compare_revisions, detect_text_blocks, and render_preview.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the listed outputs (image QA, blur detection, duplicate detection via perceptual_hash), and the sharpness note says to compare against a known-good capture. However, there is no explicit when-to-use/when-not guidance nor any reference to sibling tools such as compare_revisions for revision diffing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assetsB
Read-onlyIdempotent

List revisions in the workspace ledger (lineage, recipe hash, dimensions, sizes).

NameRequiredDescriptionDefault
asset_idNo指定した asset_id の revision だけに絞る。省略時は全件。

Output Schema

NameRequiredDescription
countYes
revisionsYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds that it lists revisions and includes specific data fields, which is useful context but does not disclose behavioral traits like pagination or ordering. With annotations covering safety, a 3 is appropriate; no contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One concise sentence that front-loads the action and includes only essential information. No filler or redundancy; every word contributes to clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one well-documented parameter, an output schema, and safety annotations, the description is sufficient for correct invocation. It does not explain domain-specific terms like 'workspace ledger', but that is likely implicit in the system context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single parameter asset_id, which includes a clear description (filter by asset_id, omit for all). The tool description adds no additional meaning beyond what the schema already provides, so the baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action (List) and resource (revisions in the workspace ledger), and enumerates returned fields (lineage, recipe hash, dimensions, sizes). It distinguishes from siblings like list_operations by focusing on revisions. However, the tool name 'list_assets' suggests assets rather than revisions, creating slight ambiguity about what is being listed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, nor any exclusions or conditions. An agent must infer usage from the name and description alone; there is no explicit 'use when...' or 'instead of...' context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_operationsA
Read-onlyIdempotent

Compact catalog of the recipe vocabulary: every operation with a one-line description and its parameter names with terse type/range hints, plus the built-in preset names. Optional category ("geometry" | "color" | "filter" | "output") narrows the list. Call explain_operation for the full schema of one operation. Read-only.

NameRequiredDescriptionDefault
categoryNo絞り込む分類(`"geometry"` | `"color"` | `"filter"` | `"output"`)。省略時は全件。

Output Schema

NameRequiredDescription
opsYesop の名前と分類だけ。要約・パラメータはテキスト側 / `explain_operation` 側。
countYes
presetsYesビルトインプリセット名(`apply_transform` / `render_preview` の `preset` に渡せる)。 説明はテキストサマリ側にだけ載せる。

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds behavioral context by specifying what the catalog contains and that category narrows the output. It also repeats the read-only property, which is consistent with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states what the tool returns, then covers the optional filter, the sibling tool to use for more detail, and the read-only nature. Every sentence earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple single-optional-parameter interface, an output schema, and annotations that already convey safety, the description provides everything needed to invoke the tool correctly. It includes the category values, the filtering behavior, and the fallback tool for deeper detail. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents the category parameter, including its allowed values and default behavior. The description adds 'narrows the list' but does not materially go beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific purpose: listing every operation in the recipe vocabulary with one-line descriptions, parameter hints, and preset names. It differentiates itself from explain_operation by explicitly directing users there for full schema details. This is far beyond a vague or tautological description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the optional category filter and its allowed values, and explicitly names explain_operation as the alternative when full schema details are needed. This gives an agent clear guidance on when to use this tool versus its sibling. The read-only note reinforces safe usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_previewA
Idempotent

Render a recipe as a small JPEG preview (long edge <= 768 by default) and return it inline plus a file path, so the composition can be checked before committing to apply_transform. Takes either recipe or preset, exactly like apply_transform - or NEITHER, which previews the revision as it is (use this with overlay="grid" to read crop coordinates off an image before writing a recipe). Optional long_edge (256..=1568) sets the preview size: raise it to 1568 when the point of the preview is to READ text in the image; 768 is too small for that. Optional overlay ("grid" | "thirds" | "horizon") draws semi-transparent composition guide lines on the returned preview only (never on the apply_transform output). overlay="mask" instead visualises a mask: pass mask_revision_id (required for this overlay and rejected for the others) and the preview is tinted red where the mask weight exceeds 0.5 and dimmed elsewhere, so the coverage can be eyeballed. Note: if the recipe's encode format is png, webp, or avif, any ICC color profile on the source is dropped (embedding is only supported for jpeg output); this is reported as a warning, not an error.

NameRequiredDescriptionDefault
presetNoビルトインプリセット名。`recipe` とは排他。
recipeNo変換レシピ。`{"operations": [...]}`。`preset` とはどちらか一方のみ指定する。
overlayNo構図確認用のガイド線。`"grid"`(1/8 刻みの格子)| `"thirds"`(三分割法)| `"horizon"`(1/12 刻みの水平線のみ、傾き目視用)| `"mask"`(マスクの被覆可視化。 `mask_revision_id` が必須)。省略時はオーバレイなし。
long_edgeNoプレビューの長辺(256..=1568)。省略時は 768。 文字を読む用途では 1568 まで上げる(DESIGN.md §9.12)。
revision_idYes入力 revision ID("rev_...")。
mask_revision_idNo`overlay: "mask"` で可視化するマスク画像 revision ID。 `overlay` が `"mask"` のときのみ指定でき、そのときは必須。

Output Schema

NameRequiredDescription
widthYes
heightYes
overlayNo適用した overlay。未指定なら null。
warningsYes
byte_sizeYes
mime_typeYes
recipe_hashYes
preview_pathYesプレビュー画像の絶対パス。
engine_versionYes
mask_revision_idNo`overlay: "mask"` で可視化したマスクの revision ID。それ以外では null。
source_revision_idYes
estimated_vision_tokensYesRough token cost of reading this preview inline: a rule of thumb for Anthropic vision models (pixels / 750, rounded up); other hosts differ. Use it to decide whether a larger `long_edge` (or reading a long document in bands) is worth it.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover safety hints (readOnly=false, idempotent, non-destructive); the description adds genuinely non-derivable behavior: overlay lines appear only on the preview and never on apply_transform output, mask overlay tints pixels red above 0.5 weight, and ICC profiles are silently dropped for png/webp/avif with a warning. It stops short of saying the preview file is written to disk (implied by readOnlyHint=false) or describing rate/size limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose and output in the first sentence, then layers parameter guidance. Every sentence carries actionable information, though the dense multi-topic prose (overlay modes, ICC caveat, size rationale) makes it longer than the minimum.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-format detail is not required, and the description still names the inline image plus path. Combined with the parameter guidance and the ICC warning, nothing an agent needs to call it correctly or interpret the result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (descriptions in Japanese), so the baseline is 3. The description nevertheless adds decision-relevant meaning beyond the schema: raise long_edge to 1568 specifically to read text because 768 is too small, and mask_revision_id is required for overlay="mask" and rejected otherwise. It does not restate enums redundantly, which is a plus.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (render) and resource (a recipe as a small JPEG preview), names the exact output (inline image plus file path), and explicitly frames its role relative to the sibling apply_transform. An agent can distinguish it from apply_transform without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it (to check composition before committing to apply_transform), how it relates to alternatives (takes recipe or preset exactly like apply_transform), and even covers the 'neither' case with a concrete use case (overlay="grid" to read crop coordinates). No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.6.4
    • Changedcompare_revisions2 fields changed
      • addedOutput schema / properties / perceptual_hash_distance
        Added value: +{
        +  "description": "Hamming distance (0..=64) between the two revisions' perceptual hashes (dHash),\non every layout. 0 means the thumbnails are identical; 5 or less usually means\nthe same picture re-encoded or resized; 20 or more means different pictures.\nNull when either side's pixels could not be hashed.",
        +  "format": "uint32",
        +  "minimum": 0,
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / ssim
        Added value: +{
        +  "description": "Structural similarity (SSIM, 0..=1) over the two images' luma. Present only with\n`layout: \"diff\"` and equal dimensions. 1.0 is pixel-identical; above ~0.98 the\ndifference is usually invisible; below ~0.9 it is a visible change of content.",
        +  "format": "double",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
    • Addeddetect_text_blocks
    • Changedexport_asset12 fields changed
      • addedInput schema / properties / dest_dir
        Added value: +{
        +  "description": "書き出し先ディレクトリ(ワークスペース外、既存のディレクトリ)。\n`revision_ids`(複数)専用。",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedInput schema / properties / dest_path / description
        Previous value: -"書き出し先パス(ワークスペース外)。"New value: +"書き出し先パス(ワークスペース外)。`revision_id`(単数)専用。"
      • changedInput schema / properties / dest_path / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • addedInput schema / properties / filename_template
        Added value: +{
        +  "description": "`dest_dir` 内のファイル名の組み立て方。既定 `\"{revision_id}.{ext}\"`。\n`revision_ids`(複数)専用。",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedInput schema / properties / revision_id / description
        Previous value: -"書き出す revision ID(\"rev_...\")。"New value: +"書き出す revision ID(\"rev_...\")。`revision_ids` とは排他で、どちらか一方が必須。"
      • changedInput schema / properties / revision_id / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • addedInput schema / properties / revision_ids
        Added value: +{
        +  "description": "複数 revision を1回で書き出す(1..=64 件)。`revision_id` とは排他。\nこのときは `dest_path` ではなく `dest_dir` を渡す。\n1件が失敗してもバッチは中断せず、`failed` に理由が入る。",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • removedInput schema / required
        Removed value: -[
        -  "revision_id",
        -  "dest_path"
        -]
      • addedOutput schema / $defs
        Added value: +{
        +  "BatchError": {
        +    "description": "バッチ要素の失敗理由。単一呼び出しが返す構造化エラーと同じ code / message。",
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "message": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "code",
        +      "message"
        +    ],
        +    "type": "object"
        +  },
        +  "BatchFailure": {
        +    "description": "バッチの1件分の失敗(パスと構造化エラーの要点)。",
        +    "properties": {
        +      "error": {
        +        "$ref": "#/$defs/BatchError"
        +      },
        +      "path": {
        +        "description": "入力で与えられたパス(または revision ID)。",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "path",
        +      "error"
        +    ],
        +    "type": "object"
        +  },
        +  "ExportAssetOutput": {
        +    "description": "`export_asset` の structuredContent。",
        +    "properties": {
        +      "byte_size": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "overwritten": {
        +        "description": "既存ファイルを上書きした場合 true。",
        +        "type": "boolean"
        +      },
        +      "path": {
        +        "description": "実際に書き出した絶対パス。",
        +        "type": "string"
        +      },
        +      "revision_id": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "revision_id",
        +      "path",
        +      "byte_size",
        +      "overwritten"
        +    ],
        +    "type": "object"
        +  },
        +  "ExportBatchOutput": {
        +    "description": "`export_asset`(バッチ)の structuredContent。",
        +    "properties": {
        +      "count": {
        +        "description": "書き出しに成功した件数(= `exported` の長さ)。",
        +        "format": "uint",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "dest_dir": {
        +        "description": "書き出し先ディレクトリの絶対パス。",
        +        "type": "string"
        +      },
        +      "exported": {
        +        "description": "入力順の成功結果。",
        +        "items": {
        +          "$ref": "#/$defs/ExportAssetOutput"
        +        },
        +        "type": "array"
        +      },
        +      "failed": {
        +        "description": "失敗した revision(1件の失敗でバッチは中断しない)。",
        +        "items": {
        +          "$ref": "#/$defs/BatchFailure"
        +        },
        +        "type": "array"
        +      },
        +      "filename_template": {
        +        "description": "実際に使ったファイル名テンプレート(既定を含む)。",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "count",
        +      "exported",
        +      "failed",
        +      "dest_dir",
        +      "filename_template"
        +    ],
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/ExportAssetOutput"
        +  },
        +  {
        +    "$ref": "#/$defs/ExportBatchOutput"
        +  }
        +]
      • removedOutput schema / properties
        Removed value: -{
        -  "byte_size": {
        -    "format": "uint64",
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  "overwritten": {
        -    "description": "既存ファイルを上書きした場合 true。",
        -    "type": "boolean"
        -  },
        -  "path": {
        -    "description": "実際に書き出した絶対パス。",
        -    "type": "string"
        -  },
        -  "revision_id": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "revision_id",
        -  "path",
        -  "byte_size",
        -  "overwritten"
        -]
    • Changedimport_asset2 fields changed
      • addedOutput schema / $defs / ImportEntry / properties / font_families
        Added value: +{
        +  "description": "Font family names this asset provides, present only when the imported file is a\nfont. Use one of these verbatim in the SVG's `font-family` and reference this\nrevision from `svg_overlay.font_revision_ids`.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • addedOutput schema / $defs / ImportOutput / properties / font_families
        Added value: +{
        +  "description": "Font family names this asset provides, present only when the imported file is a\nfont. Use one of these verbatim in the SVG's `font-family` and reference this\nrevision from `svg_overlay.font_revision_ids`.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
    • Changedinspect_image7 fields changed
      • addedInput schema / properties / include_exif
        Added value: +{
        +  "default": false,
        +  "description": "EXIF 全フィールドを `info.exif` に載せるか。既定 false。\n\n既定で落としているのはプライバシーのため: 全量には GPS 座標や\n個人名が入りうるので、明示的に要求されたときだけ返す\n(`exif_summary` と `has_gps` は従来どおり常に載る)。",
        +  "type": "boolean"
        +}
      • addedOutput schema / $defs / ExifEntry
        Added value: +{
        +  "description": "One EXIF field, rendered as text.",
        +  "properties": {
        +    "ifd": {
        +      "description": "Which IFD the field came from: primary, exif, gps, interop or thumbnail.",
        +      "type": "string"
        +    },
        +    "tag": {
        +      "description": "Tag name, or `Tag(0x____)` when the tag is not in the standard set.",
        +      "type": "string"
        +    },
        +    "value": {
        +      "description": "Formatted value including its unit. Long values are cut to 256 characters\nfollowed by `...`; maker notes and binary blobs over 1 KiB read `<N bytes>`.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ifd",
        +    "tag",
        +    "value"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / $defs / ImageInfo / properties / exif
        Added value: +{
        +  "description": "Every EXIF field found in the input, one entry per field. Present only when\nthe caller explicitly asks for it, because the full dump can include GPS\ncoordinates and other personal data.",
        +  "items": {
        +    "$ref": "#/$defs/ExifEntry"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • addedOutput schema / $defs / ImageInfo / properties / perceptual_hash
        Added value: +{
        +  "description": "Perceptual hash (dHash) as 16 lowercase hex digits, or null when the pixels\ncould not be decoded. Compare two hashes bit by bit: a Hamming distance of\n5 or less usually means the same picture re-encoded or resized.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / $defs / ImageInfo / properties / stats / description
        Previous value: -"輝度ヒストグラム統計(黒点 / 白点 / 中央値 / チャンネル平均)。\n\n**決定論的なサブサンプル**上で計算する(`crate::stats` 参照)。\n262144 画素(512x512 相当)以下の画像は全画素を使うため厳密値、\nそれより大きい画像はグリッド間引き(x, y とも k 刻み)による近似値。\nメタデータは読めたが画素デコードに失敗した場合は `None`(inspect 自体は成功させる)。"New value: +"輝度ヒストグラム統計(黒点 / 白点 / 中央値 / チャンネル平均)。\n\nヒストグラムとチャンネル平均は**決定論的なグリッド間引き**の上で計算する\n(`crate::stats` 参照。262144 画素以下は全画素なので厳密値)。`sharpness` だけは\n間引かず全画素を輝度化し、長辺 1024 へ縮小してから測る(隣接差分が要るため)。\nメタデータは読めたが画素デコードに失敗した場合は `None`(inspect 自体は成功させる)。"
      • addedOutput schema / $defs / ImageStats / properties / sharpness
        Added value: +{
        +  "description": "Variance of the 3x3 Laplacian response over the BT.709 luma, downscaled to a\nlong edge of at most 1024 px (higher = crisper edges; rounded to 1 decimal).\nScene-dependent, so treat it as a relative measure: for documents, below ~30\nusually means motion blur or defocus; compare against a known-good capture\nrather than an absolute.",
        +  "format": "double",
        +  "type": "number"
        +}
      • changedOutput schema / $defs / ImageStats / required
        Previous value: -[
        -  "luma_p0_2",
        -  "luma_p1",
        -  "luma_p50",
        -  "luma_p99",
        -  "luma_p99_8",
        -  "mean_r",
        -  "mean_g",
        -  "mean_b"
        -]New value: +[
        +  "luma_p0_2",
        +  "luma_p1",
        +  "luma_p50",
        +  "luma_p99",
        +  "luma_p99_8",
        +  "mean_r",
        +  "mean_g",
        +  "mean_b",
        +  "sharpness"
        +]
    • Changedrender_preview2 fields changed
      • addedOutput schema / properties / estimated_vision_tokens
        Added value: +{
        +  "description": "Rough token cost of reading this preview inline: a rule of thumb for Anthropic\nvision models (pixels / 750, rounded up); other hosts differ. Use it to decide\nwhether a larger `long_edge` (or reading a long document in bands) is worth it.",
        +  "format": "uint32",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "source_revision_id",
        -  "recipe_hash",
        -  "engine_version",
        -  "preview_path",
        -  "width",
        -  "height",
        -  "byte_size",
        -  "mime_type",
        -  "warnings"
        -]New value: +[
        +  "source_revision_id",
        +  "recipe_hash",
        +  "engine_version",
        +  "preview_path",
        +  "width",
        +  "height",
        +  "byte_size",
        +  "mime_type",
        +  "estimated_vision_tokens",
        +  "warnings"
        +]
  2. 12 tool updatesv0.5.2
    • First observedapply_transform
    • First observedcompare_revisions
    • First observeddetect_document
    • First observeddetect_tilt
    • First observedexplain_operation
    • First observedexport_asset
    • First observedgenerate_mask
    • First observedimport_asset
    • First observedinspect_image
    • First observedlist_assets
    • First observedlist_operations
    • First observedrender_preview

TDQS

A4.2/5.0

Scored across 13 tools

Disambiguation5/5

Each tool targets a distinct resource or action: cataloging operations, listing assets, comparing revisions, detecting text/document/tilt, exporting/importing, inspecting, previewing, applying transforms, and generating masks. The only pair with adjacent concepts is list_operations and explain_operation, but their descriptions clearly separate catalog-level discovery from single-operation schema lookup.

Naming Consistency5/5

All 13 tools use a consistent snake_case verb_noun convention (list_assets, detect_tilt, apply_transform, etc.). There are no mixed casing styles or vague one-word names.

Tool Count5/5

13 tools is well-scoped for an image workspace and processing server, with each tool covering a meaningful capability. No tool appears redundant or trivial; the surface stays within a reasonable range for both discovery and operation.

Completeness4/5

The set covers import/export, inspection, preview, full-resolution transforms, masking, comparison, and several detection workflows, which is strong lifecycle coverage for the domain. The main gap is revision/workspace cleanup—there is no delete or remove tool for ledger entries—so some housekeeping workflows require external handling.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to process images locally via file paths—converting, resizing, removing backgrounds, smart cropping, upscaling, reading or stripping metadata, and batch processing—without files ever leaving the device.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to perform local image operations such as circle cropping, cropping, resizing, compressing, converting, and inspecting images without uploading files or making network calls.
    7
    86 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to perform local computer-vision-based image recognition and editing, including cropping, resizing, rotating, background removal, drawing text and shapes, object detection, OCR, overlays, and metadata inspection without sending images to external servers.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to run real image and PDF processing remotely — compressing, converting, resizing, cropping, watermarking, and chaining multiple operations in a single call — with no local install and zero-retention handling.
    9
    MIT