Skip to main content
Glama
jicoing

MCP Image Metadata Server

by jicoing
README.md
# MCP Image Metadata Server

MCP server for extracting rich metadata from images, monetized via x402 payments.

## Live Demo

**Server:** https://mcp-image-metadata.onrender.com

---

## Quick Start

### 1. Upload Image

```bash
curl -X POST https://mcp-image-metadata.onrender.com/upload \
  -F "image=@your-image.jpg"
```

**Response:**
```json
{
  "success": true,
  "filePath": "/tmp/uploads/abc123.jpg",
  "fileName": "abc123.jpg",
  "originalName": "your-image.jpg",
  "size": 12345
}
```

### 2. Extract Metadata

```bash
curl -X POST https://mcp-image-metadata.onrender.com/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "extract_image_metadata",
      "arguments": {
        "imageUrl": "/tmp/uploads/abc123.jpg",
        "payer": "0xYourWalletAddress"
      }
    }
  }'
```

**Response:**
```json
{
  "success": true,
  "data": {
    "file": {
      "width": 1920,
      "height": 1080,
      "format": "jpeg",
      "colorDepth": 3,
      "dpi": 72,
      "fileSize": 456789,
      "mimeType": "image/jpeg"
    },
    "exif": {
      "cameraMake": "Apple",
      "cameraModel": "iPhone 14 Pro",
      "dateTime": "2024:01:15 12:30:00"
    },
    "gps": {
      "latitude": 37.7749,
      "longitude": -122.4194
    }
  },
  "price": 0.002,
  "paymentStatus": "free",
  "freemiumRemaining": 49
}
```

---

## API Endpoints

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/mcp` | POST | MCP JSON-RPC interface |
| `/upload` | POST | Upload image file |
| `/health` | GET | Health check |

---

## MCP Tools

### 1. extract_image_metadata

Extract EXIF, GPS, IPTC, XMP metadata from an image.

**Arguments:**
```json
{
  "imageUrl": "/tmp/uploads/abc123.jpg",
  "includeOptions": {
    "includeGps": true,
    "includeColor": true,
    "includeThumbnail": false,
    "includeOcr": false,
    "includeDeepHash": false
  },
  "paymentHeader": "...",
  "payer": "0xYourWallet"
}
```

**Response:**
```json
{
  "success": true,
  "data": { "file": {...}, "exif": {...}, "gps": {...} },
  "price": 0.002,
  "paymentStatus": "free",
  "freemiumRemaining": 50
}
```

---

### 2. extract_batch_metadata

Extract metadata from multiple images (max 50).

**Arguments:**
```json
{
  "imageUrls": ["/tmp/uploads/1.jpg", "/tmp/uploads/2.jpg"],
  "options": { "includeGps": true },
  "paymentHeader": "...",
  "payer": "0xYourWallet"
}
```

---

### 3. detect_image_manipulation

Analyze image for signs of manipulation/editing.

**Arguments:**
```json
{
  "imageUrl": "/tmp/uploads/abc123.jpg",
  "analysisLevel": "standard",
  "paymentHeader": "...",
  "payer": "0xYourWallet"
}
```

**analysisLevel:**
- `basic` - Basic checks ($0.002)
- `standard` - Standard analysis ($0.002)
- `forensic` - Deep forensic analysis ($0.015)

---

### 4. get_pricing

Get current pricing tiers and freemium status.

**Arguments:**
```json
{
  "payer": "0xYourWallet"
}
```

**Response:**
```json
{
  "pricing": {
    "basic": { "tier": "basic", "price": 0.001 },
    "standard": { "tier": "standard", "price": 0.002 },
    "premium": { "tier": "premium", "price": 0.005 },
    "forensic": { "tier": "forensic", "price": 0.015 }
  },
  "freemium": { "limit": 50, "remaining": 49 }
}
```

---

## Complete Usage Flow

### Step 1: Upload Image

```bash
# Upload image
curl -X POST https://mcp-image-metadata.onrender.com/upload \
  -F "image=@photo.jpg"
```

Response:
```json
{
  "success": true,
  "filePath": "/tmp/uploads/abc123.jpg"
}
```

### Step 2: Extract Metadata

```bash
curl -X POST https://mcp-image-metadata.onrender.com/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "extract_image_metadata",
      "arguments": {
        "imageUrl": "/tmp/uploads/abc123.jpg",
        "payer": "0xYourWallet123"
      }
    }
  }'
```

### Step 3: Get Updated Freemium Status

```bash
curl -X POST https://mcp-image-metadata.onrender.com/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "get_pricing",
      "arguments": {
        "payer": "0xYourWallet123"
      }
    }
  }'
```

---

## Pricing

| Tier | Price | Description |
|------|-------|-------------|
| Basic | $0.001 USDC | File info, dimensions, color profile |
| Standard | $0.002 USDC | Basic + GPS, IPTC, XMP |
| Premium | $0.005 USDC | Standard + thumbnail, deep hash |
| Forensic | $0.015 USDC | Premium + manipulation analysis |

---

## Freemium

- **50 free requests** per wallet address
- After 50, requires x402 payment
- Usage tracked in memory (resets on server restart)

---

## x402 Payment Integration

### For Agents/Apps

To make paid requests, include the `paymentHeader`:

```json
{
  "name": "extract_image_metadata",
  "arguments": {
    "imageUrl": "/tmp/uploads/abc123.jpg",
    "payer": "0xYourWallet",
    "paymentHeader": "payment=v1_USDC_..."
  }
}
```

### Payment Flow

1. Agent calls tool with x402 payment header
2. Server verifies payment via xpay facilitator
3. If valid → returns metadata
4. If invalid → returns error
5. USDC transfers to your wallet on Base

---


---

## Deployment

### Render (Recommended)

1. Push to GitHub
2. Go to [render.com](https://render.com) → New → Web Service
3. Connect your repo
4. Configure:

| Setting | Value |
|---------|-------|
| Name | mcp-image-metadata |
| Region | Oregon |
| Build Command | `npm install && npm run build` |
| Start Command | `node dist/index.js` |

5. Add Environment Variables (see above)
6. Deploy

---

## Local Development

```bash
# Install dependencies
npm install

# Build
npm run build

# Run (stdio mode)
npm run dev

# Run with HTTP server
PORT=3000 node dist/index.js
```

---

## Supported Image Formats

- JPEG/JPG
- PNG
- GIF
- WebP
- TIFF
- HEIC
- BMP
- SVG

---

## Tech Stack

- Node.js 20+
- TypeScript
- @modelcontextprotocol/sdk ^1.29.0
- Sharp (image processing)
- ExifReader (metadata parsing)
- Express (HTTP server)
- Multer (file uploads)

---

## Security

This server implements multiple security measures:

- **Path Traversal Protection**: File paths are validated to prevent directory traversal attacks
- **MIME Type Validation**: Uploaded files are validated against allowed image types
- **Input Validation**: Zod schemas reject path traversal patterns in user input
- **Error Sanitization**: Error messages are sanitized to prevent information leakage
- **Rate Limiting**: HTTP endpoints are protected with rate limiting (100 req/min per IP)
- **CORS Configuration**: Optional origin validation for cross-origin requests
- **Security Logging**: Security-relevant events are logged for monitoring

### Security Configuration

```bash
# Optional: comma-separated list of allowed origins
ALLOWED_ORIGINS=https://example.com,https://app.example.com

# Optional: rate limit window in milliseconds (default: 60000)
RATE_LIMIT_WINDOW=60000

# Optional: max requests per window per IP (default: 100)
RATE_LIMIT_MAX=100
```

---

## License

MIT

TDQS

A3.6/5.0

Scored across 4 tools

Disambiguation4/5

The tools are mostly distinct: detection vs extraction (single/batch) vs pricing. However, the two extract tools could cause minor confusion if descriptions are not carefully read.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (e.g., detect_image_manipulation, extract_batch_metadata). The use of 'get_pricing' is consistent with 'get' as a verb.

Tool Count5/5

With 4 tools, the set is well-scoped for an image metadata server: single extraction, batch extraction, manipulation detection, and pricing. No unnecessary tools.

Completeness5/5

The tools cover the core functionalities for image metadata: extracting metadata (single and batch), detecting manipulation, and retrieving pricing. No obvious gaps for the server's purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues