squoosh-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@squoosh-mcpOptimise every image in public/images for the web and give me the HTML"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
squoosh-mcp
An MCP server that lets AI agents optimise images the way an expert would. It handles a whole folder at once, deciding format, size and quality separately for each image.
It uses the codecs and settings from Squoosh: WebP by default, plus AVIF, MozJPEG, OxiPNG and libimagequant on request. Each image gets the smallest file that still meets a visual-quality score, SSIMULACRA 2, so you aren't guessing a quality number.
Unofficial. Not affiliated with or endorsed by Google or the Squoosh team.
Why
squoosh.app gives great results, but you do one image at a time, by hand, in a browser. Squoosh's batch tools apply one setting to every image, which doesn't suit a mix of photos, screenshots, logos and odd aspect ratios. squoosh-mcp lets your agent do what you would do by hand, for every image:
For each image it… | How |
Works out what it is | Photo, screenshot, graphic, icon or animation, from colour count, flat areas and edges |
Tries the encodings that suit it | Photos: lossy WebP. Screenshots and graphics: lossless, palette or lossy WebP, whichever is smallest. Add AVIF with |
Finds the lowest quality that still looks right | Searches quality until the SSIMULACRA 2 score meets the target, usually in 3–6 encodes |
Sizes it for the web | Fits a box, crops to a shape, or makes |
Never makes things worse | Keeps the original when nothing beats it; never touches your source files |
Gives you the HTML |
|
Measured on 12 phone photos (1792×2400 PNG, 81 MB in total), Apple Silicon Mac. Every image scored 75–77 against a target of 75, and at 100% zoom they're hard to tell apart from the originals.
Policy | Output | Smaller by | Time | Works in |
| 5.0 MB | 93.8% | 14 s | Every current browser (Safari 14+, iOS 14+) |
| 3.4 MB | 95.8% | 27 s | Safari 16.4+ and other current browsers |
Related MCP server: AuraImage MCP Server
Install
You need Node.js 22.17 or newer. Give the server the folders it may read and write. It refuses everything else.
Claude Code
claude mcp add squoosh -- npx -y squoosh-mcp /absolute/path/to/imagesInside a project, you can leave the path out. The server then uses the project folder (CLAUDE_PROJECT_DIR), but never your home folder or a filesystem root.
Claude Desktop
Settings → Developer → Edit Config (claude_desktop_config.json):
{
"mcpServers": {
"squoosh": {
"command": "npx",
"args": ["-y", "squoosh-mcp", "/Users/you/Pictures/site-images"]
}
}
}Cursor
.cursor/mcp.json in the project, or ~/.cursor/mcp.json:
{
"mcpServers": {
"squoosh": {
"command": "npx",
"args": ["-y", "squoosh-mcp", "${workspaceFolder}"]
}
}
}VS Code
.vscode/mcp.json (note the servers key):
{
"servers": {
"squoosh": {
"type": "stdio",
"command": "npx",
"args": ["-y", "squoosh-mcp", "."]
}
}
}Codex CLI
codex mcp add squoosh -- npx -y squoosh-mcp /absolute/path/to/imagesThe first npx download can take longer than Codex's default 10 s start-up limit. Raise it in ~/.codex/config.toml:
[mcp_servers.squoosh]
command = "npx"
args = ["-y", "squoosh-mcp", "/absolute/path/to/images"]
startup_timeout_sec = 30Windsurf / Devin Desktop
Same shape as Claude Desktop, in ~/.codeium/windsurf/mcp_config.json (Windsurf) or ~/.config/devin/mcp_config.json (Devin Desktop).
Use
Ask your agent in plain words:
"Optimise every image in
public/imagesfor the web.""Make the hero image responsive with srcset, and load it first."
"Turn these product photos into 400×400 thumbnails."
"Compress the screenshots in
docs/losslessly.""What would you do with
assets/? Don't write anything yet."
The agent calls these tools:
Tool | What it does |
| Lists images with size, dimensions, transparency and animation. With |
| Optimises files, folders or globs. Top-level settings apply to all; |
| Waits on and pages through a long batch. Calls return after 45 s with a |
| Stops a batch. Finished images stay and are skipped on the next run |
| Scores an output against its original, with optional thumbnails |
Settings, at the top level or per file:
Setting | Values | Default |
|
|
|
|
|
|
|
| none |
|
| none |
|
| none |
|
|
|
|
|
|
The balanced preset targets 75 for photos and 85 for screenshots, graphics and icons. The metric is tuned on photos and doesn't weigh faint 1-pixel UI lines heavily enough, so flat content gets a higher target.
Output
New files go to an optimized/ folder inside each input folder, mirroring its subfolders; you can set outputDir instead. Originals are never modified.
images/
hero.jpg
logo.png
optimized/
hero-1920w.webp hero-1280w.webp hero-640w.webp
logo.webp
squoosh-manifest.json ← every output, its score, and ready-to-paste markupRe-running skips images whose source and settings haven't changed. If a run is interrupted, the next run picks up where it stopped.
Supported formats
Input | Output |
JPEG, PNG, WebP, AVIF, GIF (incl. animated), TIFF | WebP (lossy, lossless, palette) by default; AVIF, JPEG (MozJPEG) and PNG (OxiPNG, palette) by policy |
Not supported yet: HEIC, SVG, BMP and ICO are skipped with a reason. Animated PNG is left as it is.
Configuration
Environment variable | Default | Meaning |
| min(4, cores ÷ 2) | Images processed in parallel (about 450 MB each for 4 MP images) |
| 45 | How long |
How it differs from Squoosh
squoosh-mcp runs Squoosh's codecs through sharp (libvips) with Squoosh's settings, plus OxiPNG. That makes it fast and native rather than browser WASM. Libraries can differ in version from squoosh.app's frozen 2024 build, so outputs are close to squoosh.app's but not byte-identical. The quality score is fast-ssim2, compiled to WebAssembly.
Development
npm install
npm run build # TypeScript → dist/, plus the prebuilt SSIMULACRA 2 WASM
npm test # unit and end-to-end tests (in-memory MCP client)
npm run fixtures # edge-case test images → test/fixtures/generated/
npm run inspector # try the tools in the MCP InspectorSee CONTRIBUTING.md.
License
Apache-2.0. Third-party components: THIRD_PARTY_NOTICES.md.
Available Tools
5 toolsanalyze_imagesAnalyse imagesARead-only
Scan files, folders or globs and report what is there: format, size, dimensions, transparency, animation. With deep: true, also classify each image (photo, screenshot, graphic, icon, animated) and show the plan optimize_images would follow (candidate formats, sizes, quality target, output path). Read-only. Paged: use offset/nextOffset. Allowed directories: (none configured).
| Name | Required | Description | Default |
|---|---|---|---|
| crop | No | Exact output shape (e.g. 400x400 thumbnails). attention keeps faces/salient areas; entropy keeps the busiest area. | |
| deep | No | Decode and classify each image (photo/screenshot/graphic/icon/animated) and show the plan. Slower; at most 50 per call. | |
| limit | No | ||
| paths | Yes | Files, folders or globs (e.g. "site/public/**/*.png") inside the allowed directories. | |
| offset | No | ||
| policy | No | auto (default): WebP (lossy, lossless or palette, whichever is smallest at the target); works in every current browser. avif: AVIF or WebP, whichever is smaller (often 20–30% smaller photos; AVIF needs Safari 16.4+). keep: same format as the source. picture: AVIF/WebP plus a JPEG/PNG fallback for <picture>. | |
| resize | No | Fit inside this box, keeping the aspect ratio. Never upscales. | |
| target | No | Visual-quality target (SSIMULACRA 2). Presets for photos: small=65, balanced=75 (default), high=85, lossless-look=90; screenshots, graphics and icons get +10 (faint UI lines need it). Or an exact number 30–100 for every image. | |
| widths | No | Responsive widths for srcset. "auto" = 640/960/1280/1920/2560 up to the image's own width. Files get a -<w>w suffix. | |
| metadata | No | strip (default): remove EXIF/GPS/XMP after auto-rotating. all: keep metadata. | |
| priority | No | Markup only: above-the-fold image (loading="eager", fetchpriority="high"). | |
| recursive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
"Read-only" is consistent with readOnlyHint=true, and the description adds context the annotations do not: paged results via offset/nextOffset, and the critical operational note that allowed directories are "(none configured)", which tells an agent calls may fail or be scoped to nothing. The depth/slowness tradeoff is stated but partly duplicates the deep param's schema text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary output, then the deep mode, then the safety/paging constraints. Dense but every clause carries information; the parenthetical "(candidate formats, sizes, quality target, output path)" is the only slightly verbose stretch.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 parameters, nested objects and no output schema, the description does the minimum: it names the reported fields and the plan contents, but never describes the result envelope (per-file entries, nextOffset, error behavior for disallowed paths). The biggest gap is failing to say that policy/target/widths/resize/crop only affect the displayed plan, leaving an agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the baseline is 3. The description explains deep, paths and offset/nextOffset paging, but ignores the nine output-shaping parameters (crop, resize, widths, target, policy, metadata, priority, limit) — an agent reading only the description would not know these merely annotate the deep plan rather than change the scan.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (scan/report) and resource (image files, folders, globs) plus exactly what is reported: format, size, dimensions, transparency, animation. It also distinguishes its two modes (shallow vs deep) and names the sibling whose plan it previews, so an agent can separate it from optimize_images without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger for the expensive mode ("With deep: true, also classify...") and implicitly routes the agent to optimize_images when it wants to act on the reported plan. It does not state when to prefer compare_images or when not to use this tool, 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.
cancel_jobCancel jobAIdempotent
Stop an optimize_images job. Images already written stay, and are recorded in the manifest so a re-run skips them.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, readOnlyHint=false, and the description reinforces them non-contradictorily while adding real value: partially written images persist and are recorded in the manifest so a re-run skips them. That partial-completion/resume semantic is not derivable from any structured field. It stops short of stating latency, error behavior, or what a cancelled-by-race job returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero waste: the action is front-loaded and the consequences follow. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool with no output schema, annotations plus the partial-completion note cover nearly everything an agent needs. The only genuine gap is the unexplained jobId and its provenance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter, jobId, with 0% schema description coverage, so the schema supplies no meaning at all. The description never mentions jobId, where to obtain it (presumably from optimize_images or get_job), or what format it takes, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Stop') and a specific resource (an optimize_images job), tying it directly to the sibling optimize_images. An agent can immediately distinguish this job-control tool from analyze_images, get_job, and compare_images.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Stop an optimize_images job', but there is no explicit when-to-use guidance, no mention of get_job for checking status first, and no statement of when cancellation is inappropriate (e.g. already-finished jobs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_imagesCompare imagesARead-only
Visual similarity of an optimised image to its original, as a SSIMULACRA 2 score (100 = identical; 90+ visually lossless; 80+ very high; 70+ high; below 50 visibly degraded), plus both sizes. Use it to check results. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| preview | No | Also return both images as small thumbnails. | |
| original | Yes | The source image. | |
| candidate | Yes | The optimised image. If its size differs, the original is resized to match before scoring. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the trailing "Read-only" is redundant, but the description earns credit for disclosing the score scale and its interpretation bands (100 identical, 90+ visually lossless, below 50 visibly degraded) and for noting both sizes are returned. It doesn't cover failure modes for invalid or mismatched inputs, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It leads with the metric and its output, then the interpretation scale, then usage — a sensible front-loaded order with no wasted sentences. The scale brackets are dense but each band carries decision value; the redundant "Read-only" is the only filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly carries the burden of explaining the return value (SSIMULACRA 2 score plus both image sizes) and the schema covers the preview option. For a simple two-input read tool this is close to sufficient; only error/edge behavior is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents original, candidate, the resize-on-size-mismatch behavior, and the preview thumbnail flag. The description adds no parameter detail beyond restating the return payload (both sizes).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact operation (visual similarity comparison between an optimised image and its original) and the precise metric returned, SSIMULACRA 2, so an agent knows this is a quality-check tool rather than a generic analyzer. It doesn't explicitly contrast itself with the sibling analyze_images, leaving that differentiation to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use it to check results" implies the post-optimization verification workflow but never states when-not to use it or names an alternative sibling (analyze_images could plausibly be confused with it). The usage context is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jobGet job statusARead-only
Progress and results of an optimize_images job. Waits up to waitSeconds for it to finish. Results are paged (offset/nextOffset). Jobs are kept in memory for an hour after they finish, until the server stops.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | ||
| limit | No | ||
| offset | No | ||
| waitSeconds | No | Wait up to this long for the job to finish before answering. | |
| response_format | No | detailed adds per-output scores, qualities and HTML markup. | concise |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description adds genuinely non-obvious behavior: a bounded blocking wait, offset/nextOffset paging of results, and an in-memory retention window of one hour (or until server restart). It stops short of saying what happens when the job is not found or has expired, which is the one behavior an agent most needs to handle an error path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose, then the wait behavior, then paging and retention. No filler, though the first sentence is a noun fragment that costs a beat of clarity compared to a verb-first phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of telling the agent what comes back, and it does so at a high level (progress plus paged results, optional detailed mode implied by the schema). Retention and blocking semantics are the right things to disclose; only the expired/not-found behavior is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40%, and the description covers just two of the five parameters: waitSeconds (already documented in the schema) and offset via the paging note. jobId, limit, and the concise/detailed response_format trade-off are left entirely to the schema, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (an optimize_images job) and what is returned (progress and results), so an agent can tell it apart from optimize_images, which creates the job. It doesn't explicitly name the sibling used to cancel or to fetch analysis, but the verb+resource pairing is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mention of waiting up to waitSeconds implies polling/blocking usage, and the phrasing hints this is the follow-up to optimize_images, but the description never says when to call it versus cancel_job or when a polling loop is appropriate. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optimize_imagesOptimise imagesAIdempotent
Optimise images like an expert, deciding per image. Default policy "auto" writes WebP, which every current browser supports: lossy for photos, lossless or palette for screenshots and graphics, whichever is smallest at the visual target. policy "avif" also tries AVIF (smaller, needs Safari 16.4+); "picture" adds a JPEG/PNG fallback; "keep" keeps the source format. Resizing fits each image's own aspect ratio and never upscales; widths makes srcset sizes; crop makes exact shapes. Writes NEW files to "/optimized/" (or outputDir), never touching originals; re-runs skip unchanged files. Works up to 45s, then returns status "running" with a jobId: call get_job to wait for the rest. Use dryRun: true to preview decisions without encoding. Allowed directories: (none configured).
| Name | Required | Description | Default |
|---|---|---|---|
| crop | No | Exact output shape (e.g. 400x400 thumbnails). attention keeps faces/salient areas; entropy keeps the busiest area. | |
| files | No | Per-file settings that override the top-level ones, e.g. [{ path: "hero.jpg", resize: { maxWidth: 1920 }, priority: true }]. | |
| limit | No | Items per page in the result. | |
| paths | No | Files, folders or globs to optimise with the top-level settings. | |
| dryRun | No | Return the per-image plan (class, candidates, sizes, output paths) without encoding anything. | |
| offset | No | First item of the page to return (use nextOffset from the previous result). | |
| policy | No | auto (default): WebP (lossy, lossless or palette, whichever is smallest at the target); works in every current browser. avif: AVIF or WebP, whichever is smaller (often 20–30% smaller photos; AVIF needs Safari 16.4+). keep: same format as the source. picture: AVIF/WebP plus a JPEG/PNG fallback for <picture>. | |
| resize | No | Fit inside this box, keeping the aspect ratio. Never upscales. | |
| target | No | Visual-quality target (SSIMULACRA 2). Presets for photos: small=65, balanced=75 (default), high=85, lossless-look=90; screenshots, graphics and icons get +10 (faint UI lines need it). Or an exact number 30–100 for every image. | |
| widths | No | Responsive widths for srcset. "auto" = 640/960/1280/1920/2560 up to the image's own width. Files get a -<w>w suffix. | |
| urlBase | No | URL prefix for generated markup, e.g. "/images/optimized". | |
| metadata | No | strip (default): remove EXIF/GPS/XMP after auto-rotating. all: keep metadata. | |
| priority | No | Markup only: above-the-fold image (loading="eager", fetchpriority="high"). | |
| outputDir | No | Default: an "optimized" folder inside each input folder, mirroring its structure. | |
| response_format | No | detailed adds per-output scores, qualities and HTML markup. | concise |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and idempotentHint=true, but the description adds substantive context beyond them: new files are written to "<input folder>/optimized/" with originals untouched, re-runs skip unchanged files, there is a 45s execution ceiling after which a jobId is returned, and the allowed-directories line flags that no directories are currently configured. These are exactly the operational constraints an agent needs before invoking a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded, leading with the default policy before enumerating variants and then the write/timeout behavior. It is on the long side and partially mirrors schema text (policies, resize semantics), but each sentence carries operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter, nested-schema, no-output-schema tool, the description covers the essentials: output location, idempotency, timeout/job handoff, dry-run preview, and the fact that no directories are configured. Minor gaps remain – urlBase, response_format, pagination (limit/offset), and metadata handling are left entirely to the schema, which does document them adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns an extra point by explaining how the parameters interact rather than restating them – per-image decisions, resizing respecting each image's own aspect ratio with no upscaling, widths producing srcset sizes, crop producing exact shapes. The policy tradeoffs are also given in prose with browser-compatibility context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ("Optimise images") plus a scope qualifier ("deciding per image"), then enumerates the policies it chooses among. An agent can immediately separate it from analyze_images (read-only analysis) and get_job (job polling), which the description names explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the default behavior (policy "auto"), when to pick alternatives ("avif" for smaller files with Safari 16.4+, "picture" for fallback markup, "keep" to preserve format), and when to use dryRun ("to preview decisions without encoding"). It also routes to get_job when the run exceeds 45s. It does not explicitly say when to prefer this over analyze_images, so it falls 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
analyze_images - First observed
cancel_job - First observed
compare_images - First observed
get_job - First observed
optimize_images
TDQS
Scored across 5 tools
Each tool has a clearly distinct role: read-only inspection (analyze_images), mutation (optimize_images), async job control (get_job, cancel_job), and quality verification (compare_images). The get_job/cancel_job pair targets the same job resource but differs cleanly by action (wait/read vs stop). No plausible misselection risk.
All five tools follow a consistent snake_case verb_noun pattern: analyze_images, optimize_images, get_job, cancel_job, compare_images. Even the resource-oriented job tools fit the same verb-first convention, with no style mixing.
Five tools is well-scoped for an image optimization server: inspection, encoding, and verification are all explicit, and get_job/cancel_job exist because optimize_images can return a long-running jobId. Nothing feels padded or missing.
The analyze → optimize → verify → manage-job lifecycle is covered, including dryRun preview, per-policy formats, resize/srcset/crop, and SSIMULACRA 2 checking. Minor gaps: no tool to list/discover outstanding jobs (a jobId is only obtainable from a running optimize call) and no way to clean up or roll back written outputs.
Maintenance
Related MCP Connectors
Convert, compress and resize many images to WebP, JPEG, PNG or AVIF; returns links and sizes.
Image processing for AI agents: resize, convert, compress, crop, and web-ready AI-generated images.
Production-ready images in one pass: resize, crop, compress, convert format, upscale, tag for SEO
Compress, convert and resize images, and scan web pages for every image they load.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables batch image compression and resizing using the TinyPNG API. Supports PNG, JPEG, WebP, and AVIF formats with detailed compression reports and multiple resize modes.10 npm2ISC

AuraImage MCP Serverofficial
AlicenseAqualityCmaintenanceEnables AI agents to audit images for LCP savings, migrate assets to AuraImage CDN, generate alt text, create responsive tags, and preview smart crops directly from the editor.521 npmMIT- AlicenseNot gradedqualityBmaintenanceEnables 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
- AlicenseNot gradedqualityAmaintenanceEnables 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.8MIT