Skip to main content
Glama
README.md
# Simple Vision MCP

A lightweight, focused Model Context Protocol (MCP) server designed specifically for image analysis using OpenAI-compatible APIs. Built with TypeScript and the MCP SDK.

## Motivation

When working with AI coding agents that don't natively support vision capabilities, you often need a reliable way to analyze images. Many existing MCP vision servers are tightly coupled to specific providers (like OpenRouter or OpenAI) or come with unnecessary complexity.

**Simple Vision MCP** was created to solve a specific problem: enabling any OpenAI-compatible API endpoint to function as a vision analysis backend. It focuses on doing one thing exceptionally well - analyzing images - while remaining flexible enough to work with any OpenAI-compatible provider.

### The Problem We Solved

During setup, we encountered several issues:
1. Many vision MCP servers only support specific providers (OpenRouter, OpenAI, etc.)
2. Container-based solutions had stdio communication issues
3. Python-based servers had dependency conflicts
4. Existing solutions were overly complex for the basic need

Simple Vision MCP addresses these by:
- Supporting **any** OpenAI-compatible API endpoint
- Running as a native Node.js process (no containers needed)
- Minimal, focused codebase that's easy to debug and maintain
- Zero external dependencies beyond the MCP SDK

## Features

- **OpenAI-Compatible**: Works with any API that follows the OpenAI chat completions format
- **Single Tool Focus**: One purpose - image analysis done right
- **TypeScript**: Full type safety and modern JavaScript
- **Minimal Dependencies**: Only essential dependencies
- **STDIO Communication**: Native MCP protocol support
- **Configurable**: Full control via environment variables
- **npx Support**: Can run directly with npx, no installation required

## Installation

### Prerequisites

- Node.js 18 or higher
- An OpenAI-compatible API endpoint with vision capabilities

### Quick Start with npx (Recommended)

No installation required - just run directly:

```bash
npx -y @erickstryck/simple-vision-mcp
```

### Global Installation

```bash
npm install -g @erickstryck/simple-vision-mcp
```

### From Source

```bash
git clone https://github.com/erickstryck/simple-vision-mcp.git
cd simple-vision-mcp
npm install
npm run build
```

## Configuration

Simple Vision MCP is configured entirely via environment variables. Create a `.env` file or export variables directly:

| Variable | Description | Required | Default |
|----------|-------------|----------|---------|
| `VISION_API_KEY` | Your API key | Yes | - |
| `VISION_BASE_URL` | API endpoint base URL | Yes | `https://api.openai.com/v1` |
| `VISION_MODEL` | Model name for vision | Yes | `gpt-4o-mini` |
| `VISION_MAX_TOKENS` | Max response tokens | No | `4096` |
| `VISION_TIMEOUT` | Request timeout (seconds) | No | `120` |
| `VISION_RESIZE` | Resize image before analysis (WxH format, e.g., 1920x1080) | No | - |

### Example .env File

```env
VISION_API_KEY=your-api-key-here
VISION_BASE_URL=https://your-custom-endpoint.com/api/v1
VISION_MODEL=Qwen3.5-4B-AWQ
VISION_MAX_TOKENS=4096
VISION_TIMEOUT=120
VISION_RESIZE=1920x1080
```

## Usage

### Running the Server

```bash
# Using npx (recommended - always gets latest version)
npx -y @erickstryck/simple-vision-mcp

# Using global installation
simple-vision-mcp

# From source
npm start

# With environment variables inline
VISION_API_KEY=your-key VISION_BASE_URL=https://api.example.com/v1 VISION_MODEL=your-model npx -y @erickstryck/simple-vision-mcp
```

### OpenCode Configuration

Add to your `opencode.json`:

```json
{
  "mcp": {
    "vision": {
      "type": "local",
      "command": ["npx", "-y", "@erickstryck/simple-vision-mcp"],
      "env": {
        "VISION_API_KEY": "your-api-key",
        "VISION_BASE_URL": "https://your-endpoint.com/api/v1",
        "VISION_MODEL": "your-vision-model"
      },
      "enabled": true
    }
  }
}
```

### Claude Desktop Configuration

Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "vision": {
      "command": "npx",
      "args": ["-y", "@erickstryck/simple-vision-mcp"],
      "env": {
        "VISION_API_KEY": "your-api-key",
        "VISION_BASE_URL": "https://your-endpoint.com/api/v1",
        "VISION_MODEL": "your-vision-model"
      }
    }
  }
}
```

### Cursor Configuration

Add to your Cursor MCP settings:

```json
{
  "mcpServers": {
    "vision": {
      "command": "npx",
      "args": ["-y", "@erickstryck/simple-vision-mcp"],
      "env": {
        "VISION_API_KEY": "your-api-key",
        "VISION_BASE_URL": "https://your-endpoint.com/api/v1",
        "VISION_MODEL": "your-vision-model"
      }
    }
  }
}
```

## Available Tools

### analyze_image

Analyzes an image and returns a detailed description.

**Parameters:**

| Parameter | Type | Description | Required |
|-----------|------|-------------|----------|
| `image_path` | string | Path to the image file | Yes |
| `prompt` | string | Custom analysis prompt | No |
| `width` | number | Target width to resize the image before analysis | No |
| `height` | number | Target height to resize the image before analysis | No |

**Default Prompt:** "Describe this image in detail, including objects, text, colors, composition, and any notable features."

**Example:**

```json
{
  "name": "analyze_image",
  "arguments": {
    "image_path": "/path/to/image.png",
    "prompt": "What objects are in this image?"
  }
}
```

**Response:**

```json
{
  "content": [
    {
      "type": "text",
      "text": "The image shows a red square with..."
    }
  ]
}
```

## Supported Image Formats

- PNG (.png)
- JPEG (.jpg, .jpeg)
- GIF (.gif)
- WebP (.webp)
- BMP (.bmp)

## Development

### Project Structure

```
simple-vision-mcp/
├── src/
│   ├── config/
│   │   └── index.ts          # Configuration loading
│   ├── services/
│   │   └── visionService.ts  # Vision API client
│   ├── tools/
│   │   └── analyzeImage.ts   # MCP tool definition
│   ├── utils/
│   │   └── imageProcessor.ts # Image processing utilities
│   └── index.ts              # Main entry point
├── bin/
│   └── cli.js                # CLI wrapper
├── tests/
│   ├── config.test.ts
│   ├── imageProcessor.test.ts
│   └── visionService.test.ts
├── package.json
├── tsconfig.json
└── README.md
```

### Building

```bash
npm run build
```

### Testing

```bash
# Run tests once
npm test

# Watch mode
npm run test:watch
```

### Design Principles

1. **Single Responsibility**: Each module has one clear purpose
2. **Dependency Injection**: Services receive dependencies via constructor
3. **Functional Core**: Business logic is pure and testable
4. **Explicit over Implicit**: Clear types and function signatures

## Troubleshooting

### "VISION_API_KEY environment variable is required"

Ensure you've set the `VISION_API_KEY` environment variable before starting the server.

### "Unsupported image format"

The image format is not supported. Ensure your image is PNG, JPEG, GIF, WebP, or BMP format.

### "Vision API error: 401"

Authentication failed. Verify your API key is correct and has access to vision capabilities.

### "Vision API error: 4xx/5xx"

Check your `VISION_BASE_URL` is correct and the API endpoint is accessible.

## License

MIT License - see LICENSE file for details.

## Contributing

Contributions welcome! Please feel free to submit a Pull Request.

TDQS

B3.4/5.0

Scored across 1 tool

Disambiguation5/5

With only one tool, there is no ambiguity; the single tool's purpose is clearly described.

Naming Consistency5/5

The tool name 'analyze_image' follows a clear verb_noun pattern in snake_case, which is consistent and descriptive.

Tool Count2/5

A single tool is insufficient for a meaningful vision server; typical vision tasks require multiple operations beyond just analysis.

Completeness2/5

Only one generalized analysis tool exists, lacking common vision capabilities like object detection, OCR, or image comparison.

Maintenance

ActivityInactive
ResponsivenessNo issues