关于 atx-mcp
atx-mcp 是以 Rust 编写的 MCP 服务,为需要可重复修改素材的 AI Agent 提供确定性、非生成式图像编辑。它保留原始文件并追踪不可变修订,便于复现和审查编辑结果。
主要功能
- 01应用声明式图像变换配方
- 02保留原件并记录不可变修订
- 03裁剪、缩放、调色及图层合成
- 04检查图像并生成蒙版
- 05比较修订并导出素材
适用场景
- 01制作裁剪后的文章或醒目图
- 02生成多种社交媒体和 CMS 尺寸
- 03发布前移除 GPS 元数据
- 04审查并复现图像编辑历史
MCP 相关
该 MCP 服务使用 stdio,提供 13 种用于导入、检查、变换、预览、比较和导出图像素材的工具。MCP 客户端可对配置工作区中的素材执行配方。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
atx-mcp
这是一款用于通用 AI Agent 的确定性(非生成式)资产转换 MCP 服务,以 Rust 编写。
它会将编辑意图——“拉平地平线,裁剪为 16:9,稍微调亮”——作为声明式转换配方执行,并将每个结果记录为不可变版本。原始资产绝不会被修改。
倾斜校正 + 自动色阶 + 应用风格效果(完全确定性的配方)——左:输入 / 右:输出。
完整设计请参阅 docs/DESIGN.md。
使用场景
-
文章醒目图片
“把这张照片摆正,并裁剪为 16:9、1600px 的醒目图片。使用 WebP。”
import_asset→detect_tilt(如果照片已经接近水平,AI 会跳过校正)→apply_transform(旋转 → 裁剪 → 调整大小 → 编码)→export_asset。原图永远不会被改动,同一套处理方案每次都能得到相同结果。 -
社交媒体/CMS 多种尺寸
“为这张照片生成 OGP、Instagram 方形图和缩略图版本。” 一张原图会并行生成 OGP 1200×630、Instagram 1080 方形图和 400px 缩略图。同一处理方案、同一修订版本具有幂等性,因此重新运行不会重复创建输出;也可以直接使用一个词作为预设名称。
-
安全发布
“务必移除位置信息,但不要改动颜色。”
strip_metadata(exif)会移除包括 GPS 在内的 EXIF,同时保留 ICC 配置文件。AI 也可以先检查inspect_image返回的has_gps,并提前发出警告。 -
颜色与风格调整
“只让天空更蓝,其他部分都保持原样。” 支持
curves/levels/hsl/white_balance、film_soft预设,以及通过import_asset导入自定义.cubeLUT,再使用lut应用。 -
局部(蒙版)调整
“只把天空稍微调暗,地面保持原样。”
generate_mask会生成蒙版(渐变、亮度范围或色相范围);将其接入调整后,使用overlay:"mask"调用render_preview,即可在提交前准确查看受影响的区域。 -
图层合成
“模糊这张照片的副本,并以 50% 的滤色模式混合,营造柔和光晕。”
layers堆栈结合 16 种混合模式、不透明度和蒙版,可构建柔焦等可复现的合成效果。 -
水印、修图与透视校正
“把我的 Logo 印在角落,移除电线,并校正会聚的垂直线。”
svg_overlay会叠加 Logo;clone/heal通过同时合成纹理和色调来去除瑕疵或电线;perspective则会校正会聚的垂直线。 -
读取文档(OCR 预处理)
“帮我读取这张收据照片。” / “这张幻灯片上写了什么?”
detect_document会找到页面或屏幕,并返回可直接粘贴使用的perspective四边形;ocr_document预设(灰度、自动色阶、轻度锐化)和trim会将像素预算集中到文本上;使用long_edge:1568调用render_preview,即可把模型实际能够读取的图像交给它。此处不包含 OCR 引擎:由模型负责读取,atx 只负责让像素清晰易读且可复现。detect_text_blocks会回答决定后续处理的问题——“缩小后这些文本还能看清吗?应该在哪里裁切?”——返回按阅读顺序排列的文本块,以及可直接粘贴使用的crop裁切带。threshold(Otsu / Sauvola)和ocr_binarize则供外部 OCR 引擎使用。 -
验证与追溯
“把这张图编辑前后的效果并排展示给我。”
compare_revisions会并排展示编辑前后的图像,或返回带有mean_abs_diff等统计数据的差异热力图。每个修订版本都会保留其溯源信息,因此可以追踪并复现文章所用任意图像的完整编辑历史——在任何机器上都能得到完全相同的字节内容。 -
将一张扫描图拆分为单独图像
“一页上扫描了两张装裱好的纸。把它们分别保存为两个文件,每张纸周围都保留一点装裱部分。” 没有拆分操作:模型会针对同一源修订版本,为每个部分各运行一次
apply_transform(用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 从其 vendored 源代码构建)。
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
请注意两点。必须使用 -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 | 简明列出配方词汇表:每项操作的单行说明、简要参数提示,以及内置预设名称。可选的 category:"geometry"|"color"|"filter"|"output" 用于筛选类别(只读) |
explain_operation | 某项操作的完整参考资料:参数表(类型、范围、是否必需/默认值、语义)、可直接粘贴的 JSON 示例及注意事项。也可使用内置预设名称,并返回其完整操作列表。名称无效时,会按组列出有效操作和预设(只读) |
import_asset | 将本地图像导入工作区(基于 sha256 幂等)。单个文件使用 path,最多 64 个文件的批次使用 paths(单个文件失败不会中止整个批次)。如果文件内容已是此工作区中某个配方的输出,则会通过 already_derived_from 发出警告 |
inspect_image | 检查尺寸、EXIF 摘要、ICC 配置文件、是否包含 GPS 数据、亮度统计、sharpness 分数(拉普拉斯方差,是相对值,因此应与同一主体的已知良好拍摄图像进行比较),以及用于判断“是否为同一张图片”的 perceptual_hash(dHash,16 位十六进制数字)。include_exif:true 还会以 {ifd, tag, value} 条目的形式返回所有 EXIF 字段;默认关闭,因为完整转储可能包含 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。不会猜测;未找到四边形时会返回 quad:null 和原因(no_quad_found / already_rectified / low_confidence)(只读) |
detect_text_blocks | 通过 Otsu 二值化 + 运行长度涂抹 + 连通组件检测类似文本的区块(标题、段落、表格、说明文字),按阅读顺序排列;每个区块都包含 line_count、median_line_height_px 和 ink_ratio。legibility.line_height_at_1568_px 用于说明文本缩小至长边 1568 像素时是否仍清晰可读(低于约 16 像素时通常无法辨读);legibility.recommended_bands 会将图像拆分为符合该标准的水平区域,每个条目都是可在 render_preview 前粘贴的 crop 操作(只读) |
generate_mask | 生成确定性的灰度蒙版(linear_gradient / radial_gradient / luminosity_range / color_range),作为 PNG 版本,其尺寸与参考图像相同,可在操作的 mask 字段中引用(幂等) |
render_preview | 以低分辨率应用配方(或 preset)(默认长边 ≤768;long_edge 可设为 256..1568,以便将清晰可读的页面交给视觉模型),并以内嵌图像形式返回。overlay:"grid"|"thirds"|"horizon" 会叠加构图辅助线;overlay:"mask"(需搭配 mask_revision_id)会用色彩标示蒙版覆盖区域(仅绘制在预览图上,不影响实际变换)。此外还会报告 estimated_vision_tokens,这是返回图像的粗略预算,按 width*height/750 计算 |
apply_transform | 以全分辨率应用配方(或 preset),并生成新版本(相同配方始终生成相同版本)。单张图像使用 revision_id,对最多 64 张图像批量执行相同配方则使用 revision_ids |
compare_revisions | 将两个版本缩小至长边 ≤640,并合成为一张内嵌图像;可通过 layout:"side_by_side"|"stacked" 排列(用于 A/B 和处理前后视觉比较),也可使用 layout:"diff" 返回单张像素差异热力图,以及 mean_abs_diff / max_abs_diff / changed_pixel_ratio 和 ssim 分数(要求尺寸相同)。所有布局都会报告 perceptual_hash_distance,即两个 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(裁剪、
填充) / trim / resize(覆盖、包含、填满) / 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 是一种资源,而非图像:先导入,再在配方中指定它生成的修订版本。
- 使用
import_asset导入.cube文件。它会以不可变修订版本的形式存储,其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 类似:先导入,再通过配方将其印到
栅格图像上。
- 使用
import_asset导入.svg文件。它会以不可变修订版本的形式存储,其mime_type: "image/svg+xml",摘要会报告 SVG 的固有尺寸(0x0表示没有固有尺寸—— 根<svg>上既没有viewBox,也没有绝对的width/height)。inspect_image会有意拒绝处理它:它是矢量资源,而非栅格图像。 - 在配方中引用返回的
revision_id:
{ "op": "svg_overlay", "svg_revision_id": "rev_...",
"x": 24, "y": 24, "width": 320, "opacity": 0.25, "blend_mode": "normal" }
x/y 是叠加层在图像处理流水线的当前位置坐标系中的左上角(因此应将叠加层
放在调整大小/裁剪之后);允许使用负值,溢出部分会被裁剪。省略 width 和
height 时,会按 SVG 的固有尺寸栅格化;指定其中一个时,会在保持宽高比的同时缩放;
指定两者时,会拉伸至精确尺寸框——没有固有尺寸的 SVG 若未同时指定两者,会返回结构化错误。
合成采用与
layers 相同的 W3C 公式和 16 种 blend_mode 值。
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 (嵌入二进制文件中)绘制文本,另外还会使用通过font_revision_ids传入的字体 (最多 4 种)。不会加载其他字体,因此所有机器上的输出都完全相同。- 字体与 LUT 或 SVG 一样,属于资源:使用
import_asset导入.ttf/.otf文件,摘要会报告可填入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(额外角度) | 一种色相类别(天蓝色、叶绿色) |
你也可以通过 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)会按当前图像像素单位中的该高斯 sigma 模糊蒙版边缘。
- 使用
overlay:"mask"和mask_revision_id调用render_preview,会将权重大于 0.5 的区域染成红色,并调暗其他区域,以便在提交前检查覆盖范围。
蒙版与 LUT 一样通过修订版 ID 引用,因此适用同样的注意事项:配方哈希包含该 ID,且只有在包含该蒙版的工作区中才能复现配方。
图层
配方可以使用 layers 堆栈,而非(或同时使用)扁平的 operations 列表。图层从下至上合成;每个图层的 ops 都先针对其自身源图像运行,再混合到当前合成结果上:
{
"layers": [
{ "source": "base", "ops": [] },
{
"source": { "revision_id": "rev_..." },
"ops": [{ "op": "blur", "sigma": 8 }],
"blend_mode": "multiply",
"opacity": 0.6
}
],
"operations": [
{ "op": "resize", "width": 1600 },
{ "op": "encode", "format": "webp", "quality": 82 }
]
}
source可以是"base"(传递给apply_transform/render_preview的输入修订版),也可以是{"revision_id": "rev_..."}(工作区中已有的任意其他修订版)。每个图层的源图像尺寸都必须与基础图像完全一致,否则配方会在任何像素处理开始前返回结构化错误。ops是常规操作列表,仅应用于该图层的源图像。mask、blend_mode(默认值为"normal")和opacity(默认值为1.0)用于控制图层与其下方图层的合成方式。- 混合模式为 16 种 W3C 模式之一:12 种可分离模式
normal、multiply、screen、overlay、darken、lighten、color_dodge、color_burn、hard_light、soft_light、difference、exclusion,以及 4 种不可分离模式hue、saturation、color、luminosity。 - 存在
layers时,顶层operations将成为收尾处理阶段,在合成结果上执行一次——resize和最终的encode应放在此处(encode仍必须是最后一项,且最多出现一次)。 - 调用
explain_operation {"operation":"layers"}查看完整参考。
预设
预设也可以内联在配方内部,作为单个操作使用——{"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 操作使用) |
| social | og_1200x630 | Open Graph 分享图片:裁剪为 1200:630,调整为 1200px 宽,WebP q82 |
| social | x_wide_16_9 | X (Twitter) 宽幅卡片:裁剪为 16:9,调整为 1600px 宽,WebP q82 |
| social | instagram_square_1080 | Instagram 方形帖子:裁剪为 1:1,调整为 1080x1080,WebP q85 |
| social | instagram_portrait_4_5 | Instagram 竖版帖子:裁剪为 4:5,调整为 1080x1350,WebP q85 |
| social | youtube_thumb_1280x720 | YouTube 缩略图:裁剪为 16:9,调整为 1280x720,WebP q85 |
| social | hero_2400 | 大幅主视觉/横幅图片:适配至 2400px 以内,WebP q85 |
| building block | soft_vignette | 单独添加细腻暗角,用于叠加在其他效果之后 |
| building block | grain_fine | 单独添加轻微、细腻且确定性的颗粒,用于叠加 |
| ocr | ocr_document | 让页面/幻灯片/白板照片更易被视觉模型识别:转为灰度、自动调整色阶、轻微锐化(不进行二值化) |
| ocr | ocr_receipt | 处理有噪点或褪色的收据:转为灰度、中值去噪、加强自动色阶、锐化 |
| ocr | ocr_binarize | 使用 Sauvola 自适应二值化,供外部 OCR 引擎使用(若由视觉模型读取结果,优先使用 ocr_document) |
| ocr | ocr_dark_ui | 处理深色模式截图:先用 trim 裁掉边缘,再反相为深色文字浅色背景的灰度图 |
预设只是语法糖:它会解析为对应的配方,并经过常规处理管线;recipe_hash(幂等键)根据解析后的配方计算,因此,调用预设与使用等效原始配方会得到相同的修订版本。
保证
- 确定性:相同的输入和配方始终会生成逐字节完全相同的输出(通过黄金测试进行回归检查)
- 幂等性:配方会经过规范化处理(键排序,
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
Crate 布局:atx-core(配方/转换引擎)/ atx-geometry(倾斜检测)/ atx-store(不可变资源存储)/ atx-mcp(rmcp stdio 服务)。
这三个库以更长的名称发布在 crates.io 上,因为那里的 atx-core 是一个无关项目:
| 目录 | 发布名称 | 代码中的库名称 |
|---|---|---|
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。
二进制文件中附带的非 crate 内容(打包的 Roboto Regular 字体)及其来源和许可证列于 THIRD_PARTY_NOTICES.md。
如果 atx-mcp 为你节省了时间,可以请我喝杯咖啡 ☕
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。