Skip to main content
Glama

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 policy: "avif"

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 srcset widths, keeping each image's own aspect ratio and never upscaling

Never makes things worse

Keeps the original when nothing beats it; never touches your source files

Gives you the HTML

<picture>/<img> markup with srcset, width/height and lazy loading

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

auto (default): WebP

5.0 MB

93.8%

14 s

Every current browser (Safari 14+, iOS 14+)

avif: AVIF or WebP

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/images

Inside 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/images

The 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 = 30

Windsurf / 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/images for 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

analyze_images

Lists images with size, dimensions, transparency and animation. With deep, it also classifies each one and shows the plan

optimize_images

Optimises files, folders or globs. Top-level settings apply to all; files[] overrides them per image. dryRun shows the plan without writing

get_job

Waits on and pages through a long batch. Calls return after 45 s with a jobId and keep working

cancel_job

Stops a batch. Finished images stay and are skipped on the next run

compare_images

Scores an output against its original, with optional thumbnails

Settings, at the top level or per file:

Setting

Values

Default

policy

auto (WebP: lossy, lossless or palette, whichever is smallest) · avif (AVIF or WebP, whichever is smaller) · keep (same format as the source) · picture (AVIF/WebP plus a JPEG/PNG fallback for <picture>)

auto

target

small · balanced · high · lossless-look · a number 30–100 (100 = lossless)

balanced

resize

{ maxWidth, maxHeight }: fit inside, never upscale

none

crop

{ width, height, strategy: attention | entropy | center }

none

widths

"auto" (640/960/1280/1920/2560 up to the image's width) or a list

none

priority

true for above-the-fold images (eager loading, fetchpriority="high")

false

metadata

strip (removes EXIF/GPS after auto-rotating) · all

strip

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 markup

Re-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

SQUOOSH_MCP_CONCURRENCY

min(4, cores ÷ 2)

Images processed in parallel (about 450 MB each for 4 MP images)

SQUOOSH_MCP_INLINE_SECONDS

45

How long optimize_images works before handing back a jobId

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 Inspector

See CONTRIBUTING.md.

License

Apache-2.0. Third-party components: THIRD_PARTY_NOTICES.md.

Available Tools

5 tools
analyze_imagesAnalyse imagesA
Read-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).

NameRequiredDescriptionDefault
cropNoExact output shape (e.g. 400x400 thumbnails). attention keeps faces/salient areas; entropy keeps the busiest area.
deepNoDecode and classify each image (photo/screenshot/graphic/icon/animated) and show the plan. Slower; at most 50 per call.
limitNo
pathsYesFiles, folders or globs (e.g. "site/public/**/*.png") inside the allowed directories.
offsetNo
policyNoauto (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>.
resizeNoFit inside this box, keeping the aspect ratio. Never upscales.
targetNoVisual-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.
widthsNoResponsive widths for srcset. "auto" = 640/960/1280/1920/2560 up to the image's own width. Files get a -<w>w suffix.
metadataNostrip (default): remove EXIF/GPS/XMP after auto-rotating. all: keep metadata.
priorityNoMarkup only: above-the-fold image (loading="eager", fetchpriority="high").
recursiveNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 jobA
Idempotent

Stop an optimize_images job. Images already written stay, and are recorded in the manifest so a re-run skips them.

NameRequiredDescriptionDefault
jobIdYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 imagesA
Read-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.

NameRequiredDescriptionDefault
previewNoAlso return both images as small thumbnails.
originalYesThe source image.
candidateYesThe optimised image. If its size differs, the original is resized to match before scoring.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 statusA
Read-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.

NameRequiredDescriptionDefault
jobIdYes
limitNo
offsetNo
waitSecondsNoWait up to this long for the job to finish before answering.
response_formatNodetailed adds per-output scores, qualities and HTML markup.concise

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 imagesA
Idempotent

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).

NameRequiredDescriptionDefault
cropNoExact output shape (e.g. 400x400 thumbnails). attention keeps faces/salient areas; entropy keeps the busiest area.
filesNoPer-file settings that override the top-level ones, e.g. [{ path: "hero.jpg", resize: { maxWidth: 1920 }, priority: true }].
limitNoItems per page in the result.
pathsNoFiles, folders or globs to optimise with the top-level settings.
dryRunNoReturn the per-image plan (class, candidates, sizes, output paths) without encoding anything.
offsetNoFirst item of the page to return (use nextOffset from the previous result).
policyNoauto (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>.
resizeNoFit inside this box, keeping the aspect ratio. Never upscales.
targetNoVisual-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.
widthsNoResponsive widths for srcset. "auto" = 640/960/1280/1920/2560 up to the image's own width. Files get a -<w>w suffix.
urlBaseNoURL prefix for generated markup, e.g. "/images/optimized".
metadataNostrip (default): remove EXIF/GPS/XMP after auto-rotating. all: keep metadata.
priorityNoMarkup only: above-the-fold image (loading="eager", fetchpriority="high").
outputDirNoDefault: an "optimized" folder inside each input folder, mirroring its structure.
response_formatNodetailed adds per-output scores, qualities and HTML markup.concise

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

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 ("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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.1.0
    • First observedanalyze_images
    • First observedcancel_job
    • First observedcompare_images
    • First observedget_job
    • First observedoptimize_images

TDQS

A4.2/5.0

Scored across 5 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
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
    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.
    8
    MIT