npm package: @icogenie/mcp
Description: MCP server for IcoGenie - Enable AI agents to generate icons programmatically
Author: ICOGenie
Latest version: 0.4.2

# @icogenie/mcp

[![npm version](https://img.shields.io/npm/v/@icogenie/mcp.svg)](https://www.npmjs.com/package/@icogenie/mcp)
[![npm downloads](https://img.shields.io/npm/dm/@icogenie/mcp.svg)](https://www.npmjs.com/package/@icogenie/mcp)
[![MCP Protocol](https://img.shields.io/badge/MCP-1.0+-blue.svg)](https://modelcontextprotocol.io)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

MCP (Model Context Protocol) server for IcoGenie. Enables AI agents like Claude to generate production-ready SVG icons programmatically.

## Installation

```bash
npm install -g @icogenie/mcp
# or use directly with npx
npx @icogenie/mcp
```

## Configuration

### Claude Desktop

Add to your Claude Desktop configuration (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):

```json
{
  "mcpServers": {
    "icogenie": {
      "command": "npx",
      "args": ["-y", "@icogenie/mcp"]
    }
  }
}
```

### Claude Code

The server works automatically when installed globally or via npx.

## Authentication

On first use, the MCP server will:
1. Open your browser for authentication
2. Ask you to approve access
3. Save the session token to `~/.icogenie/config.json`

Subsequent uses are automatic - the token is shared with the [IcoGenie CLI](https://www.npmjs.com/package/@icogenie/cli).

### CI/CD Environments

Set `ICOGENIE_SESSION_TOKEN` environment variable to skip browser authentication:

```bash
export ICOGENIE_SESSION_TOKEN="your-session-token"
```

## Available Tools

### generate_icon
Generate a single icon preview from a text description.

**Cost:** 1 credit

```
generate_icon({
  prompt: "home icon",
  style: "solid",       // or "outline"
  variations: 1,        // 1, 2, or 4
  referenceImagePath: "/path/to/reference.png"  // optional
})
```

**Returns:** `{ sessionId, preview, previews, creditsRemaining, sessionData, suggestions }`

### regenerate_icon
Regenerate a specific icon variation. Returns 4 candidate previews — use `confirm_regeneration` to finalize your choice (two-phase flow).

**Cost:** 1 credit

```
regenerate_icon({
  sessionId: "abc123",       // for single icons
  bundleId: "xyz789",        // for bundles (use one or the other)
  index: 0,                  // which variation (0-based)
  prompt: "Make it more 3D"  // optional refinement
})
```

**Returns:** `{ candidates, regenToken, creditsRemaining }`

### confirm_regeneration
Finalize a regeneration by selecting one of the 4 candidates.

**Cost:** Free (included in regenerate_icon)

```
confirm_regeneration({
  regenToken: "tok_abc123",
  selectedIndex: 2           // 0-3, which candidate to keep
})
```

**Returns:** `{ success, preview, creditsRemaining }`

### check_credits
Check your current credit balance.

**Cost:** Free

```
check_credits()
```

**Returns:** `{ credits, team, user }`

### download_icon
Download the final SVG + PNG package for an icon or bundle.

**Cost:** 5 credits (single) or 4 credits/icon (bundle)

```
download_icon({
  generationId: "abc123",  // or bundleId
  outputPath: "./icons.zip"  // optional, returns base64 if omitted
})
```

### normalize_bundle
Plan an icon bundle by generating an AI-enhanced icon list from a description.

**Cost:** Free (rate-limited)

```
normalize_bundle({
  description: "food delivery app",
  targetCount: 10,
  style: "solid"
})
```

**Returns:** `{ bundleId, icons, bundleType, styleRecommendation, reasoning }`

### generate_bundle
Generate a bundle of icons from an icon list.

**Cost:** 1 credit per icon

```
generate_bundle({
  icons: [
    { name: "home", description: "Home navigation icon" },
    { name: "cart", description: "Shopping cart icon" }
  ],
  style: "solid",
  bundleId: "bundle_abc123"  // optional, from normalize_bundle
})
```

**Returns:** `{ bundleId, iconCount, icons: [{ name, description, preview }], pricing, creditsUsed, creditsRemaining }`

### save_to_library
Save a generated icon to your personal library.

**Cost:** Free

```
save_to_library({
  generationId: "abc123",
  name: "notification-bell",  // optional display name
  tags: ["ui", "alerts"]      // optional tags
})
```

**Returns:** `{ success, libraryItemId }`

### list_library
List icons saved in your library.

**Cost:** Free

```
list_library({
  page: 1,       // optional, default 1
  limit: 20,     // optional, default 20
  tag: "ui"      // optional filter
})
```

**Returns:** `{ items: [{ id, name, tags, preview, createdAt }], total, page }`

### download_from_library
Download an icon from your library as SVG + PNG.

**Cost:** Free

```
download_from_library({
  libraryItemId: "lib_abc123",
  outputPath: "./bell-icon.zip"  // optional, returns base64 if omitted
})
```

**Returns:** `{ savedTo }` or `{ base64, filename }`

### claim_daily_credits
Claim 2 free credits, available once every 24 hours.

**Cost:** Free

```
claim_daily_credits()
```

**Returns:** `{ credited, creditsRemaining, nextClaimAt }`

## Example Workflow

1. **Check credits:**
   ```
   check_credits()
   → { credits: 50, team: { name: "Personal" } }
   ```

2. **Generate a single icon:**
   ```
   generate_icon({ prompt: "notification bell icon", style: "outline" })
   → { sessionId: "abc123", preview: "...", creditsRemaining: 49 }
   ```

3. **Refine if needed (two-phase):**
   ```
   regenerate_icon({ sessionId: "abc123", index: 0, prompt: "Add a dot indicator" })
   → { candidates: ["...", "...", "...", "..."], regenToken: "tok_xyz", creditsRemaining: 48 }

   confirm_regeneration({ regenToken: "tok_xyz", selectedIndex: 1 })
   → { success: true, preview: "...", creditsRemaining: 48 }
   ```

4. **Download final package:**
   ```
   download_icon({ generationId: "abc123", outputPath: "./bell-icon.zip" })
   → { savedTo: "./bell-icon.zip" }
   ```

## Bundle Workflow

1. **Plan the bundle (free):**
   ```
   normalize_bundle({ description: "e-commerce app icons", targetCount: 8 })
   → { icons: [{ name: "cart", ... }, ...], styleRecommendation: "outline" }
   ```

2. **Review and generate (pass bundleId for traceability):**
   ```
   generate_bundle({ icons: [...], style: "outline", bundleId: "bundle_abc" })
   → { bundleId: "bundle_abc", icons: [...], credits: { previewUsed: 8 } }
   ```

3. **Download bundle:**
   ```
   download_icon({ bundleId: "xyz789", outputPath: "./ecommerce-icons.zip" })
   ```

## Environment Variables

| Variable | Description | Default |
|----------|-------------|---------|
| `ICOGENIE_API_URL` | API endpoint | `https://www.icogenie.xyz` |
| `ICOGENIE_SESSION_TOKEN` | Session token (for CI/CD) | - |
| `ICOGENIE_CONFIG_DIR` | Config directory | `~/.icogenie` |

## Credit Pricing

| Action | Cost |
|--------|------|
| Preview (single) | 1 credit |
| Preview (bundle) | 1 credit/icon |
| Download (single) | 5 credits |
| Download (bundle) | 4 credits/icon |
| Regenerate | 1 credit |
| Daily claim | 2 free credits/day |
| Library ops | Free |

Purchase credits at [www.icogenie.xyz](https://www.icogenie.xyz).

## When to Use MCP vs CLI vs Web

| Use Case | Best Option |
|----------|-------------|
| Generate icons inside Claude/Cursor | **MCP** |
| Automate in CI/CD pipelines | **CLI** |
| Quick one-off generation | **Web** |
| Batch generate icon bundles | **CLI** or **MCP** |
| Browse and manage icon library | **Web** |

## Related

- [@icogenie/cli](https://www.npmjs.com/package/@icogenie/cli) - Command-line interface
- [IcoGenie Web](https://www.icogenie.xyz) - Web application
- [AI Agent Docs](https://www.icogenie.xyz/ai-docs) - Machine-readable documentation
- [Developer Docs](https://www.icogenie.xyz/docs) - Integration guides

## License

MIT