Skip to main content
Glama
leky90

MCP Image Compare Server

by leky90
README.md
# MCP Image Compare Server

[![npm version](https://badge.fury.io/js/mcp-image-compare-server.svg)](https://www.npmjs.com/package/mcp-image-compare-server)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Node.js Version](https://img.shields.io/node/v/mcp-image-compare-server)](https://nodejs.org)

> **[TiαΊΏng Việt](README-VN.md)** | English

A Model Context Protocol (MCP) server for pixel-perfect image comparison using [Pixelmatch](https://github.com/mapbox/pixelmatch) from Mapbox. Compare images, capture and compare screenshots, detect visual differences with precision.

## Features

- 🎯 **Pixel-perfect comparison** - Detect even single-pixel differences
- 🎨 **Perceptual color difference** - YIQ color space for human-like perception
- πŸ” **Anti-aliasing detection** - Smart detection and exclusion of anti-aliased pixels
- πŸ“Š **Detailed statistics** - Pixel count, percentage, dimensions
- πŸ–ΌοΈ **Visual diff output** - Color-coded difference visualization
- 🌐 **Web screenshot support** - Compare with live websites
- πŸ“ **Multiple formats** - PNG and JPEG support
- ⚑ **Fast & lightweight** - ~60-80KB package size

## Quick Start

### Installation

```bash
# Install globally
npm install -g mcp-image-compare-server

# Install Chromium for screenshots
npx playwright install chromium
```

### Configuration

#### For Claude Desktop

Add to your Claude Desktop config file:

**Windows:** `%APPDATA%\Claude\claude_desktop_config.json`  
**macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`  
**Linux:** `~/.config/Claude/claude_desktop_config.json`

```json
{
  "mcpServers": {
    "image-compare": {
      "command": "npx",
      "args": ["-y", "mcp-image-compare-server"]
    }
  }
}
```

Restart Claude Desktop after configuration.

#### For Cursor

Add to your Cursor MCP settings file:

**Windows:** `%APPDATA%\Cursor\User\globalStorage\mcp.json`  
**macOS:** `~/Library/Application Support/Cursor/User/globalStorage/mcp.json`  
**Linux:** `~/.config/Cursor/User/globalStorage/mcp.json`

```json
{
  "mcpServers": {
    "image-compare": {
      "command": "npx",
      "args": ["-y", "mcp-image-compare-server"]
    }
  }
}
```

Or through Cursor settings:

1. Open Cursor Settings (`Ctrl+,` or `Cmd+,`)
2. Search for "MCP"
3. Click "Edit in settings.json"
4. Add the configuration above

Restart Cursor after configuration.

### Usage

Ask in Claude Desktop or Cursor:

```
Compare image1.png and image2.png
```

That's it! πŸŽ‰

## Tools

### 1. compare_images

Compare two local image files.

**Parameters:**

- `image1_path` (string, required) - Path to first image
- `image2_path` (string, required) - Path to second image
- `diff_output_path` (string, optional) - Where to save diff image
- `threshold` (number, optional) - Comparison threshold (0-1), default 0.1
- `includeAA` (boolean, optional) - Include anti-aliased pixels, default false

**Example:**

```json
{
  "image1_path": "./screenshots/before.png",
  "image2_path": "./screenshots/after.png",
  "diff_output_path": "./diff-result.png",
  "threshold": 0.1
}
```

### 2. compare_image_with_url

Compare a local image with a screenshot from a URL.

**Parameters:**

- `image_path` (string, required) - Path to local image
- `url` (string, required) - URL to capture and compare
- `diff_output_path` (string, optional) - Where to save diff image
- `threshold` (number, optional) - Comparison threshold (0-1), default 0.1
- `includeAA` (boolean, optional) - Include anti-aliased pixels, default false

**Example:**

```json
{
  "image_path": "./design-mockup.png",
  "url": "https://example.com",
  "threshold": 0.15
}
```

### 3. compare_urls

Compare screenshots from two different URLs.

**Parameters:**

- `url1` (string, required) - First URL to capture
- `url2` (string, required) - Second URL to capture
- `diff_output_path` (string, optional) - Where to save diff image
- `threshold` (number, optional) - Comparison threshold (0-1), default 0.1
- `includeAA` (boolean, optional) - Include anti-aliased pixels, default false

**Example:**

```json
{
  "url1": "https://staging.example.com",
  "url2": "https://production.example.com"
}
```

## Output Format

All tools return JSON with detailed statistics:

```json
{
  "success": true,
  "diffPixels": 1234,
  "totalPixels": 921600,
  "percentDiff": 0.13,
  "width": 1280,
  "height": 720,
  "diffImagePath": "/path/to/diff.png",
  "message": "Comparison completed: 1234 pixels differ (0.13%)"
}
```

**Fields:**

- `success` - Operation status (true/false)
- `diffPixels` - Number of different pixels
- `totalPixels` - Total pixels in image
- `percentDiff` - Percentage difference
- `width` - Image width in pixels
- `height` - Image height in pixels
- `diffImagePath` - Path to generated diff image
- `message` - Human-readable result message
- `error` - Error message (if failed)

## Use Cases

### Visual Regression Testing

Compare UI before and after updates to catch unintended changes.

```
I have two screenshots:
- before-update.png
- after-update.png

Compare them and tell me what changed.
```

### Cross-browser Testing

Compare rendering across different browsers to ensure consistency.

### Design Review

Compare design mockups with actual implementation.

```
Compare design-mockup.png with https://myapp.com/landing
```

### A/B Testing

Compare different versions of the same page.

```
Compare:
- https://myapp.com/variant-a
- https://myapp.com/variant-b
```

### Mobile vs Desktop

Compare responsive layouts across different viewports.

## Configuration

### Threshold Values

The `threshold` parameter (0-1) controls comparison sensitivity:

- **0.0** - Very sensitive, detects smallest differences
- **0.1** - Default, good balance for most cases
- **0.3** - Less sensitive, ignores minor differences
- **1.0** - Least sensitive, only major differences

### Anti-aliasing

When `includeAA = false` (default), the server automatically detects and ignores anti-aliased pixels, reducing false positives from different rendering engines.

### Diff Image Colors

- **Red**: Different pixels
- **Yellow**: Anti-aliased pixels (if includeAA = true)
- **Faded**: Matching pixels (reduced opacity)

## Installation Methods

### Method 1: NPM Global (Recommended)

```bash
npm install -g mcp-image-compare-server
npx playwright install chromium
```

Configure Claude Desktop:

```json
{
  "command": "npx",
  "args": ["-y", "mcp-image-compare-server"]
}
```

### Method 2: NPX (No Installation)

Configure Claude Desktop:

```json
{
  "command": "npx",
  "args": ["-y", "mcp-image-compare-server"]
}
```

First run will download the package automatically.

### Method 3: From Source

```bash
git clone https://github.com/leky90/mcp-image-compare-server.git
cd mcp-image-compare-server
npm install
npx playwright install chromium
npm run build
```

Configure Claude Desktop or Cursor:

```json
{
  "command": "node",
  "args": ["/absolute/path/to/mcp-image-compare-server/dist/index.js"]
}
```

Replace `/absolute/path/to/mcp-image-compare-server` with your actual path.

## System Requirements

- **Node.js:** 18.0.0 or higher
- **npm:** 8.0.0 or higher
- **OS:** Windows 10+, macOS 10.15+, Linux (Ubuntu 20.04+)
- **Disk:** ~500MB (includes Chromium browser)
- **RAM:** 2GB minimum

## Troubleshooting

### Server doesn't connect

1. Verify config path is correct
2. Ensure you ran `npm run build`
3. Restart Claude Desktop or Cursor completely
4. Check the MCP logs for errors

### "Browser not found" error

```bash
npx playwright install chromium
```

### Screenshot timeout

For slow websites, the default 30-second timeout will handle most cases. If issues persist, please report.

### Out of memory

For very large images:

- Resize images before comparison
- Use lower resolution images
- Increase Node.js memory: `node --max-old-space-size=4096 dist/index.js`

## Development

### Building from Source

```bash
npm install
npm run build
```

### Running Locally

```bash
npm start
# or
npm run dev
```

### Testing

See [CONTRIBUTING.md](CONTRIBUTING.md) for development guidelines.

## Tech Stack

- **Framework:** [Model Context Protocol SDK](https://github.com/modelcontextprotocol)
- **Image Comparison:** [Pixelmatch](https://github.com/mapbox/pixelmatch)
- **Screenshots:** [Playwright](https://playwright.dev/)
- **Image Processing:** [Sharp](https://sharp.pixelplumbing.com/), [pngjs](https://github.com/lukeapage/pngjs)
- **Language:** TypeScript

## Contributing

Contributions are welcome! Please read [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

## Changelog

See [CHANGELOG.md](CHANGELOG.md) for version history.

## License

MIT License - see [LICENSE](LICENSE) file for details.

## Acknowledgments

Built with:

- [Pixelmatch](https://github.com/mapbox/pixelmatch) by Mapbox
- [Model Context Protocol](https://modelcontextprotocol.io/)
- [Playwright](https://playwright.dev/)
- [Sharp](https://sharp.pixelplumbing.com/)

## Support

- πŸ› **Bug Reports:** [GitHub Issues](https://github.com/leky90/mcp-image-compare-server/issues)
- πŸ’¬ **Questions:** [GitHub Discussions](https://github.com/leky90/mcp-image-compare-server/discussions)
- πŸ“– **Documentation:** This README

---

**Made with ❀️ using TypeScript and MCP**

TDQS

A4.2/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a distinct purpose: two local files, local file vs URL screenshot, and two URL screenshots. No overlap.

Naming Consistency5/5

All tools follow a consistent 'compare_' prefix with clear argument differentiation (images, image_with_url, urls).

Tool Count5/5

Three tools cover the essential image comparison scenarios without unnecessary bloat.

Completeness5/5

The tool set fully covers local-local, local-URL, and URL-URL comparisons. No obvious gaps for typical use cases.

Maintenance

ActivityInactive
ResponsivenessNo issues