가벼운 의존성 없는 C 바이너리를 사용하여 AI 클라이언트가 이미지를 변환, 크기 조정, 자르기 및 필터 적용을 할 수 있도록 합니다.
다른 이름 swperb/imgcli, imgcli-mcp
- 스타
- 0
- Tools
- —
- 다운로드, 30일
- —
- 최신 버전
- 0.2.0
- 마지막 커밋
- 2026년 11월 13일
- 라이선스
- MIT
imgcli MCP란?
imgcli은(는) MCP server입니다. 가벼운 의존성 없는 C 바이너리를 사용하여 AI 클라이언트가 이미지를 변환, 크기 조정, 자르기 및 필터 적용을 할 수 있도록 합니다.
프로젝트 README에서 생성된 요약
imgcli MCP server 정보
imgcli는 빠른 변환, 크기 조정 및 필터링을 위해 설계된 가벼운 도구로, AI 클라이언트를 통한 효율적인 이미지 처리를 지원합니다. 의존성이 없는 단일 C 바이너리로 작동하며 로컬 머신에서 실행되므로, 속도와 적은 리소스 사용량이 중요한 자동화 파이프라인에 이상적입니다. AI agent는 convert_image, probe_image, list_filters와 같은 특정 도구를 사용하여 무거운 시스템 라이브러리 없이도 시각 데이터를 조작할 수 있습니다.
이 서버는 ffmpeg 스타일의 filtergraph 구문을 사용하여 스케일링, 자르기, 그레이스케일 및 세피아와 같은 색상 조정 등 복잡한 작업을 단 한 번의 패스로 실행합니다. PNG, JPEG, BMP, TGA, GIF, PPM, QOI를 포함한 다양한 형식을 지원합니다. libc에만 연결되는 232 KB 크기의 독립형 바이너리이므로 ImageMagick과 같은 대규모 툴킷의 오버헤드와 복잡성을 피할 수 있으며, 썸네일 생성이나 이미지 워터마크 작업에 더 빠른 대안을 제공합니다.
활용 사례
- 1배치 썸네일 생성AI agent가 단일 명령으로 폴더 내의 모든 이미지를 작은 썸네일로 크기 조정할 수 있습니다.
- 2복잡한 시각적 필터 적용채도, 대비, 블러와 같은 여러 효과를 결합하여 AI에게 이미지 스타일을 변경하도록 지시할 수 있습니다.
- 3자동 이미지 워터마크개발자는 이 도구를 사용하여 특정 불투명도 설정으로 기본 이미지 위에 로고를 겹칠 수 있습니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
imgcli MCP 설치 방법
형식 확인: 2026년 11월 10일Claude Code에 imgcli MCP 설치
$ claude mcp add imgcli -- npx -y imgcli-mcpCursor에 imgcli MCP 설치
~/.cursor/mcp.json
{
"mcpServers": {
"imgcli": {
"command": "npx",
"args": [
"-y",
"imgcli-mcp"
]
}
}
}VS Code에 imgcli MCP 설치
.vscode/mcp.json
{
"servers": {
"imgcli": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"imgcli-mcp"
]
}
}
}Claude Desktop에 imgcli MCP 설치
claude_desktop_config.json
{
"mcpServers": {
"imgcli": {
"command": "npx",
"args": [
"-y",
"imgcli-mcp"
]
}
}
}Codex에 imgcli MCP 설치
~/.codex/config.toml
[mcp_servers.imgcli] command = "npx" args = ["-y", "imgcli-mcp"]
Gemini CLI에 imgcli MCP 설치
~/.gemini/settings.json
{
"mcpServers": {
"imgcli": {
"command": "npx",
"args": [
"-y",
"imgcli-mcp"
]
}
}
}구성
IMGCLI_BINPath to the imgcli binary if not on PATH (e.g. after `brew install swperb/tap/imgcli`).
| 이름 | 설명 | 유형 |
|---|---|---|
| IMGCLI_BIN | Path to the imgcli binary if not on PATH (e.g. after `brew install swperb/tap/imgcli`). |
자동 검사
2026년 11월 14일에 실행됨전체 보고서 →자동 검사를 통과했습니다. 이는 보안 감사가 아닙니다. 코드를 직접 읽고 서버에 필요한 최소한의 권한만 부여하십시오. 검사 방식
- 소스 저장소 연결 및 접근 가능swperb/imgcli is public and reachablegithub.com/swperb/imgcli ↗통과
- 패키지가 이 저장소를 소스로 지정imgcli-mcp names swperb/imgcli as sourcenpmjs.com/package/imgcli-mcp ↗통과
- 빌드 출처(Sigstore 증명)No build attestation published for this release검사되지 않음
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-11-02github.com/swperb/imgcli ↗통과
- OpenSSF ScorecardOpenSSF Scorecard 7.9 / 10; weakest: CII-Best-Practices 0, Signed-Releases 0, Code-Review 2scorecard.dev/viewer/?uri=github.com/swperb/imgcli ↗통과
- 패키지 이름이 인기 패키지와 유사하지 않음No popular package one edit away from imgcli-mcp통과
- 패키지와 의존성에 심각한 보안 권고 없음99 resolved dependencies checked; no critical advisoryosv.dev ↗통과
- 모델에 대한 숨겨진 지침 없음0 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨검사되지 않음
- 원격 endpoint가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기imgcli — command-line image conversion & processing in C
ImageMagick's power, ffmpeg's syntax, zero dependencies. A tiny C binary that converts, resizes, crops, filters, and composites images — PNG, JPEG, BMP, TGA, GIF, PPM, QOI — driven by an ffmpeg-style filtergraph. No system libraries; compiles anywhere a C11 compiler exists.
⚡ ~8× faster than ImageMagick on common resize/filter ops, in a 232 KB single binary (~470× smaller) — see the benchmarks. A lightweight alternative to ImageMagick
convertorffmpegfor still images.

# Convert + resize + filter in one pass:
imgcli -i photo.jpg -vf "scale=1024:-1,grayscale,contrast=1.2,gblur=1.5" out.png
What it does: format conversion · resize / scale · crop · pad · rotate · flip · brightness / contrast / saturation / gamma / hue · grayscale · sepia · invert · threshold · box & Gaussian blur · sharpen · Sobel edge detect · emboss · custom convolution kernels · alpha-composite overlay · draw boxes · solid fills.
Design: the same paradigm as ffmpeg — decode → normalize to one common frame format (RGBA) → run a comma-separated filtergraph → encode by output extension.
Benchmarks
imgcli vs ImageMagick on an Apple Silicon Mac (single-threaded, warm cache).
Reproduce with make && bench/bench.sh — see bench/RESULTS.md
for the full method and caveats.
| Operation | imgcli | ImageMagick | speedup |
|---|---|---|---|
| PNG→JPEG + resize (one-shot) | 1.6 ms | 4.7 ms | 2.9× |
| Resize 1200×1200 → 300w | 6.0 ms | 51.6 ms | 8.6× |
| Grayscale 1200×1200 | 48.4 ms | 389 ms | 8.0× |
| Footprint | imgcli | ImageMagick |
|---|---|---|
| Install size | 232 KB | ~109 MB (≈470× larger) |
| Dependencies | 0 (libc only) | 17 packages |
ImageMagick is a far broader 16-bit/HDRI toolkit with 200+ formats; imgcli is a lean 8-bit pipeline that wins on speed, size, and startup — the shape that matters when an agent or script spawns one process per task.
Dependencies & formats
The default build is dependency-free — a single binary that links only the
system C library (libc). Decoding/encoding is handled by the bundled,
public-domain stb and
qoi single-header libraries, compiled
directly in. Nothing to apt install, no shared libraries, no version hell.
- Built-in formats — no dependencies: PNG, JPEG, BMP, TGA, GIF, PPM, QOI. Other formats that can be implemented in plain C (e.g. TIFF) will also be built in and keep the binary dependency-free.
- Formats that need external libraries — opt-in only: WebP, AVIF, HEIC, and JPEG XL
cannot be decoded without large external libraries (libwebp, libavif, libheif, libjxl);
there is no public-domain single-header decoder for them and they are not
practical to hand-roll. If imgcli adds these, it will be strictly via opt-in
build flags (e.g.
make WEBP=1) that link those libraries.
The "zero dependencies" claim applies to the default build, and always will — opt-in format libraries are never compiled into it. A build that enables such a flag is, by definition, no longer dependency-free, and that trade-off is stated at the point you opt in.
Why it's structured this way
| ffmpeg concept | imgcli equivalent |
|---|---|
AVFrame / pixfmt |
every image is normalized to packed 8-bit RGBA (Image) |
| demuxer/decoder | img_load via vendored stb_image (PNG/JPEG/BMP/TGA/GIF/…) |
-vf filtergraph |
name=a:b:c, name, … chain parsed in filters.c |
AVFilter |
each filter mutates or replaces the current frame |
| muxer (by extension) | img_save (png/jpg/bmp/tga + a hand-written PPM writer) |
lavfi test sources |
testsrc=, color=, gradient=, checker= generators |
Codecs come from the public-domain stb
single-header libraries (third_party/). They're bundled, not linked, so the
tool stays portable and self-contained while still reading/writing the formats
the world actually uses — the same trade-off ffmpeg makes by leaning on codec
libraries instead of reinventing them.
Install
# Homebrew (macOS / Linux)
brew install swperb/tap/imgcli
# Nix (no install — run straight from GitHub)
nix run github:swperb/imgcli -- -y -i in.png out.jpg
nix profile install github:swperb/imgcli
# Debian / Ubuntu / WSL (.deb from the latest release)
curl -fsSLO https://github.com/swperb/imgcli/releases/latest/download/imgcli_0.5.0_amd64.deb
sudo apt install ./imgcli_0.5.0_amd64.deb
# Arch (AUR)
yay -S imgcli # or: paru -S imgcli
# Docker
docker run --rm -v "$PWD:/work" -w /work ghcr.io/swperb/imgcli -y -i in.png out.jpg
# Windows — winget
winget install swperb.imgcli
# Windows — Scoop (installs straight from the manifest)
scoop install https://raw.githubusercontent.com/swperb/imgcli/main/packaging/scoop/imgcli.json
# Prebuilt binaries: https://github.com/swperb/imgcli/releases
# From source (only a C compiler and -lm required)
make # produces ./imgcli
make demo # generates a few sample images
sudo make install # installs the binary + man page to /usr/local
Use it as a native agent tool (MCP)
An MCP server wraps imgcli so AI agents can
call convert_image, probe_image, and list_filters directly — see
mcp/.
Usage
imgcli [-i INPUT]... [-vf GRAPH] [-q N] [-f FMT] [-y|-n] [--json] OUTPUT
-i INPUT a file, '-' for stdin, or a generator (testsrc=WxH,
color=NAME:WxH, gradient=WxH, checker=WxH). Repeat -i for
compositing inputs; the first is the primary frame, the rest
feed `overlay`.
-vf GRAPH filtergraph, e.g. "scale=800:-1,grayscale,gblur=2"
-q N JPEG quality 1..100 (default 90)
-f FMT output format (png/jpg/bmp/tga/ppm/qoi); required when OUTPUT
is '-' (stdout), an optional override for files
-y / -n overwrite / never overwrite the output
--out-dir D batch mode: write one output per input into D (basename kept,
extension from -f or the input). Globs in -i are expanded.
--fail-fast in batch mode, stop at the first failing file
--json emit one machine-readable JSON result line (an array in batch)
--quiet suppress the human-readable success line
--dry-run validate the filtergraph + report output dims; write nothing
-filters [NAME] list every filter, or just NAME's syntax (add --json for a
machine-readable list)
-info print input dimensions and exit
-V print version
-h help
OUTPUT is a file path or '-' for stdout. When piping, the result line is
written to stderr so stdout carries only the encoded image bytes.
Batch mode (`--out-dir`) processes each input independently and keeps going on
per-file errors (use `--fail-fast` to stop). The exit code is non-zero if any
file failed.
Colours accept #rgb, #rrggbb, #rrggbbaa, 0x…, r-g-b[-a], or names
(red, white, transparent, …). No commas, so they're safe inside a graph.
Filters
Geometry — scale=W:H[:nearest|bilinear|bicubic|lanczos] (-1 keeps aspect;
bicubic/lanczos are high-quality separable resamplers that anti-alias on
downscale and stay sharp on upscale — bilinear is the default),
crop=W:H[:X:Y], pad=W:H[:X:Y[:color]], hflip, vflip,
transpose=90|180|270, rotate=DEG[:color] (arbitrary angle, canvas expands).
Colour — grayscale, invert, sepia, solarize, brightness=V, temperature=V,
contrast=V, saturation=V, gamma=V, hue=DEG, threshold=V, opacity=V, tint=color.
Convolution — blur=R (box), gblur=SIGMA (separable Gaussian),
sharpen[=AMOUNT], edge (Sobel), emboss, convolution=K[:DIV:BIAS]
(custom N×N kernel, e.g. convolution=0 -1 0 -1 5 -1 0 -1 0).
Composite / draw — overlay=X:Y[:INDEX] (alpha "over" compositing of
another -i input), fill=color, drawbox=X:Y:W:H:color[:fill|thickness].
Examples
# Thumbnail, preserving aspect ratio (lanczos = best downscale quality)
imgcli -i photo.jpg -vf "scale=400:-1:lanczos" thumb.png
# Stylise: desaturate a touch, boost contrast, soften
imgcli -i photo.jpg -vf "saturation=0.6,contrast=1.15,gblur=1" look.jpg
# Watermark a logo in the top-left, 60% opacity, then convert to JPEG
imgcli -i page.png -i logo.png -vf "opacity=0.6,overlay=24:24" out.jpg
# Rotate 30° onto a transparent canvas
imgcli -i sticker.png -vf "rotate=30:transparent" rotated.png
# No input file? Generate a test card.
imgcli -i testsrc=640x480 card.png
# Pipe-friendly: read stdin, write stdout (use -f to name the output format)
curl -s https://example.com/in.png | imgcli -i - -vf "scale=800:-1" -f jpg - > out.jpg
# Batch a whole folder into thumbnails (one call; per-file results)
imgcli -i "photos/*.jpg" --out-dir thumbs -vf "scale=400:-1:lanczos" -f png
For AI agents & scripting
imgcli is built to be a reliable tool in an automated pipeline: one self-contained binary, no dependencies, deterministic, non-interactive, and machine-readable. See AGENTS.md for a token-economical recipe sheet.
# Always pass -y (don't prompt) and --json (parseable result) in automation:
imgcli --json -y -i in.jpg -vf "scale=512:-1" out.png
# -> {"ok":true,"output":"out.png","width":512,"height":341,"format":"png","bytes":34122}
- Deterministic & non-interactive — never prompts; refuses to overwrite
without
-y; one process per conversion. - Structured output —
--jsonfor results,--quietto silence chatter; stable exit codes (0ok,1runtime error,2usage error). - No network, no subprocesses — safe to run on untrusted inputs in a sandbox.
- Probe without converting —
imgcli --json -info -i file.jpg.
Security
imgcli decodes untrusted image files in C, so memory safety is taken seriously. The codebase has been audited against the OWASP Top 10, common C/CWE classes, and ffmpeg's historical vulnerability classes. Highlights:
- Decompression-bomb safe — dimensions are validated from the header before pixels are decoded; hard caps on size (16384 px/axis, 64 Mpx).
- Integer-overflow-safe allocation through a single capped choke point.
- No protocols/URLs/subprocesses — ffmpeg's worst class (SSRF / file-read via HLS playlists) is structurally impossible here.
- Hardened build (
_FORTIFY_SOURCE, stack protector, PIE/RELRO, format warnings), ASan/UBSan (make asan), and a fuzz harness (make fuzz).
Full threat model, OWASP/CWE mapping, ffmpeg-CVE-class analysis, and dependency policy: SECURITY.md.
Layout
src/image.{h,c} Image (RGBA frame) + load/save (stb glue, PPM writer)
src/filters.{h,c} filtergraph parser + every filter + registry
src/source.{h,c} synthetic input generators
src/util.{h,c} colour / size parsing
src/main.c CLI argument handling (incl. --json output)
third_party/ vendored stb_image.h, stb_image_write.h (public domain)
fuzz/ libFuzzer harness for the decode -> filtergraph path
AGENTS.md token-economical usage guide for agents/scripts
SECURITY.md threat model, OWASP/CWE mapping, hardening, dependency policy
Contributing
Contributor setup, validation targets, filter-registry guidance, and PR expectations live in CONTRIBUTING.md.
Have a question or idea? Use Discussions. For bugs and feature/format requests, open an issue — the templates will guide you.
Support
If imgcli is useful to you, consider sponsoring its development — it funds new formats, security hardening, and maintenance. See SPONSORS.md.
License
The imgcli source is yours to use freely (MIT). The vendored stb
headers are public domain (or MIT, at your option) and the vendored qoi.h is
MIT-licensed; full third-party notices are in
THIRD_PARTY_NOTICES.md.
imgcli MCP 질문
imgcli MCP를 Claude Code에 추가하려면 어떻게 하나요?
터미널에서 claude mcp add imgcli -- npx -y imgcli-mcp를 실행합니다. 모든 프로젝트에서 사용할 수 있게 하려면 --scope user를 추가합니다.
imgcli MCP를 Cursor에 추가하려면 어떻게 하나요?
~/.cursor/mcp.json를 열고 mcpServers 아래에 서버를 추가합니다. 위 설치 섹션에 표시된 Cursor 구성을 사용합니다.
imgcli가 기본적으로 지원하는 이미지 형식은 무엇인가요?
기본 빌드는 외부 의존성 없이 PNG, JPEG, BMP, TGA, GIF, PPM, QOI를 지원합니다.
자동화 파이프라인이나 AI agent와 함께 imgcli를 사용할 수 있나요?
네, 머신 러닝이 가능한 결과를 위한 --json 플래그, 불필요한 출력을 억제하는 --quiet 플래그를 제공하며 비대화형 방식으로 설계되어 자동화에 적합합니다.
신뢰할 수 없는 이미지 파일에 imgcli를 실행해도 안전한가요?
네, decompression-bomb 방지, 정수 오버플로 방지 할당과 같은 보안 기능을 포함하고 있으며 네트워크 프로토콜이나 subprocess를 지원하지 않습니다.