Skip to main content
Glama
johndavedecano

icon-search-mcp

README.md
# Icon Search MCP Server

A powerful Model Context Protocol (MCP) server that provides unified search capabilities across multiple icon libraries with fuzzy search, intelligent caching, and comprehensive filtering options.

## ๐Ÿš€ Features

- **Multi-Library Support**: Search across multiple icon libraries simultaneously
- **Fuzzy Search**: Advanced search with typo tolerance using Fuse.js
- **Intelligent Caching**: Fast response times with smart caching strategies
- **Comprehensive Filtering**: Filter by library, style, category, tags, and more
- **NPM Package Integration**: Automatic icon library management via NPM packages
- **TypeScript**: Full type safety and excellent developer experience
- **MCP Protocol**: Standard Model Context Protocol for seamless integration

## ๐Ÿ“ฆ Supported Icon Libraries

- **Bootstrap Icons** - Official open source SVG icon library for Bootstrap
- **Feather** - Beautiful open source icons
- **Octicons** - GitHub's icon library
- **Tabler Icons** - Free and open source icons

## ๐Ÿ› ๏ธ Installation

### NPM Package

```bash
npm install -g icon-search-mcp
```

### From Source

```bash
git clone https://github.com/your-org/icon-search-mcp.git
cd icon-search-mcp
npm install
npm run build
```

### Build Icon Index

```bash
# Build icon indices from NPM packages
npm run build-icons
```

## ๐Ÿš€ Quick Start

### As MCP Server

```bash
# Start the MCP server
npm start
```

### Configuration

The server can be configured via environment variables:

```bash
# Cache configuration
CACHE_TTL=300000          # Cache TTL in milliseconds (default: 5 minutes)
CACHE_MAX_SIZE=1000       # Maximum cache entries (default: 1000)

# Search configuration
DEFAULT_SEARCH_LIMIT=50   # Default search result limit
FUZZY_THRESHOLD=0.3       # Default fuzzy search threshold

# Logging
LOG_LEVEL=info           # Logging level (error, warn, info, debug)
```

## ๐Ÿ”Œ Configuration for MCP Clients

### Claude Desktop

Add the icon search MCP server to your Claude Desktop configuration:

**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": {
    "icon-search": {
      "command": "npx",
      "args": ["icon-search-mcp"],
      "env": {
        "CACHE_TTL": "300000",
        "DEFAULT_SEARCH_LIMIT": "50",
        "LOG_LEVEL": "info"
      }
    }
  }
}
```

### VS Code MCP Extension

Configure the MCP extension in VS Code settings:

```json
{
  "mcp.servers": [
    {
      "name": "icon-search",
      "command": "npx",
      "args": ["icon-search-mcp"],
      "cwd": "${workspaceFolder}",
      "env": {
        "CACHE_TTL": "300000",
        "DEFAULT_SEARCH_LIMIT": "50"
      }
    }
  ]
}
```

### Local Development Setup

For development with a local build:

```json
{
  "mcpServers": {
    "icon-search-dev": {
      "command": "node",
      "args": ["dist/index.js"],
      "cwd": "/path/to/icon-search-mcp",
      "env": {
        "NODE_ENV": "development",
        "LOG_LEVEL": "debug",
        "CACHE_TTL": "60000"
      }
    }
  }
}
```

### Docker Configuration

Using the Docker image:

```json
{
  "mcpServers": {
    "icon-search-docker": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "--env",
        "CACHE_TTL=300000",
        "--env",
        "LOG_LEVEL=info",
        "icon-search-mcp:latest"
      ]
    }
  }
}
```

### Environment Variables for Client Configuration

Configure the server behavior through environment variables:

| Variable               | Description                              | Default      | Example       |
| ---------------------- | ---------------------------------------- | ------------ | ------------- |
| `CACHE_TTL`            | Cache time-to-live in milliseconds       | `300000`     | `600000`      |
| `CACHE_MAX_SIZE`       | Maximum number of cached entries         | `1000`       | `2000`        |
| `DEFAULT_SEARCH_LIMIT` | Default number of search results         | `50`         | `100`         |
| `FUZZY_THRESHOLD`      | Default fuzzy search threshold (0.0-1.0) | `0.3`        | `0.5`         |
| `LOG_LEVEL`            | Logging verbosity                        | `info`       | `debug`       |
| `NODE_ENV`             | Environment mode                         | `production` | `development` |

### Connection Verification

After configuring your MCP client, verify the connection:

1. **Check Server Status**: The server should appear in your MCP client's server list
2. **Test Basic Tool**: Try the `list_libraries` tool to verify connectivity
3. **Check Logs**: Look for connection messages in the client logs

### Troubleshooting

#### Common Issues

**Server Not Starting**

```bash
# Check if the package is installed
npm list -g icon-search-mcp

# Reinstall if needed
npm install -g icon-search-mcp
```

**Permission Errors**

```bash
# On Unix systems, ensure proper permissions
chmod +x $(which icon-search-mcp)
```

**Icon Index Missing**

```bash
# Build the icon index
cd /path/to/icon-search-mcp
npm run build-icons
```

#### Debug Mode

Enable debug logging for troubleshooting:

```json
{
  "mcpServers": {
    "icon-search": {
      "command": "npx",
      "args": ["icon-search-mcp"],
      "env": {
        "LOG_LEVEL": "debug",
        "NODE_ENV": "development"
      }
    }
  }
}
```

#### Connection Testing

Test the server manually:

```bash
# Start the server directly
npx icon-search-mcp

# Or with debug output
LOG_LEVEL=debug npx icon-search-mcp
```

### Advanced Configuration

#### Custom Icon Libraries

Configure additional icon libraries by setting up the icon index:

```bash
# Add custom libraries to package.json dependencies
npm install custom-icon-library

# Rebuild the icon index
npm run build-icons
```

#### Performance Tuning

For high-performance scenarios:

```json
{
  "env": {
    "CACHE_TTL": "1800000",
    "CACHE_MAX_SIZE": "5000",
    "DEFAULT_SEARCH_LIMIT": "100",
    "FUZZY_THRESHOLD": "0.2"
  }
}
```

#### Memory Optimization

For memory-constrained environments:

```json
{
  "env": {
    "CACHE_MAX_SIZE": "500",
    "DEFAULT_SEARCH_LIMIT": "25",
    "NODE_OPTIONS": "--max-old-space-size=512"
  }
}
```

## ๐Ÿ“– API Reference

### Available Tools

#### `search_icons`

Search for icons by name across all or specific libraries with fuzzy matching.

**Parameters:**

- `query` (string, required): Search term for icon names
- `libraries` (string[], optional): Specific libraries to search in
- `fuzzy` (boolean, optional): Enable fuzzy search (default: true)
- `limit` (number, optional): Maximum results to return (default: 10)
- `threshold` (number, optional): Fuzzy search threshold 0.0-1.0 (default: 0.3)
- `includeScore` (boolean, optional): Include match scores (default: true)

**Example:**

```json
{
  "query": "home",
  "libraries": ["bootstrap-icons", "feather"],
  "fuzzy": true,
  "limit": 20,
  "threshold": 0.3
}
```

**Response:**

```json
{
  "query": "home",
  "results": [
    {
      "item": {
        "name": "house",
        "library": "bootstrap-icons",
        "tags": ["house", "home", "building"],
        "style": "regular",
        "path": "node_modules/bootstrap-icons/icons/house.svg",
        "categories": ["navigation"],
        "size": "16x16"
      },
      "score": 0.0
    }
  ],
  "totalResults": 15,
  "searchType": "fuzzy",
  "executionTime": 45,
  "libraries": ["bootstrap-icons", "feather"]
}
```

#### `get_icon`

Get detailed information about a specific icon.

**Parameters:**

- `id` (string, required): Unique identifier of the icon
- `library` (string, required): Library name where the icon is located

**Example:**

```json
{
  "id": "house",
  "library": "bootstrap-icons"
}
```

#### `list_libraries`

Get a list of all available icon libraries.

**Parameters:** None

**Response:**

```json
{
  "libraries": ["bootstrap-icons", "feather", "octicons", "lucide", "tabler-icons"],
  "count": 5
}
```

#### `get_library_info`

Get detailed information about a specific library.

**Parameters:**

- `library` (string, required): Name of the library

**Response:**

```json
{
  "name": "bootstrap-icons",
  "displayName": "Bootstrap Icons",
  "description": "Official open source SVG icon library for Bootstrap",
  "version": "1.11.3",
  "iconCount": 1800,
  "categories": ["navigation", "communication", "media", "ui"],
  "styles": ["regular"],
  "isAvailable": true
}
```

#### `search_by_category`

Find icons by category or tag with fuzzy matching.

**Parameters:**

- `category` (string, required): Category name to search for
- `libraries` (string[], optional): Specific libraries to search in
- `fuzzy` (boolean, optional): Enable fuzzy search (default: true)
- `limit` (number, optional): Maximum results to return (default: 10)

## ๐Ÿ—๏ธ Architecture

### Core Components

```
src/
โ”œโ”€โ”€ index.ts                 # Main MCP server entry point
โ”œโ”€โ”€ providers/               # Icon provider implementations
โ”‚   โ”œโ”€โ”€ icon-provider.interface.ts
โ”‚   โ”œโ”€โ”€ base-npm-provider.ts
โ”‚   โ”œโ”€โ”€ heroicons.provider.ts
โ”‚   โ”œโ”€โ”€ bootstrap-icons.provider.ts
โ”‚   โ”œโ”€โ”€ feather.provider.ts
โ”‚   โ”œโ”€โ”€ octicons.provider.ts
โ”‚   โ”œโ”€โ”€ lucide.provider.ts
โ”‚   โ”œโ”€โ”€ simple-icons.provider.ts
โ”‚   โ””โ”€โ”€ tabler-icons.provider.ts
โ”œโ”€โ”€ services/               # Core services
โ”‚   โ”œโ”€โ”€ search.service.ts   # Unified search service
โ”‚   โ””โ”€โ”€ cache.service.ts    # Caching service
โ”œโ”€โ”€ tools/                  # MCP tools
โ”‚   โ””โ”€โ”€ index.ts           # Icon search tools
โ”œโ”€โ”€ types/                  # TypeScript type definitions
โ”‚   โ””โ”€โ”€ index.ts
โ””โ”€โ”€ utils/                  # Utility functions
    โ””โ”€โ”€ errors.ts
```

### Provider System

The provider system allows easy addition of new icon libraries:

```typescript
export abstract class IconProvider {
  abstract initialize(): Promise<void>;
  abstract searchIcons(query: string, options?: FuseSearchOptions): Promise<FuseResult<Icon>[]>;
  abstract getIcon(id: string): Promise<Icon | null>;
  abstract getAllIcons(): Promise<Icon[]>;
  abstract getInfo(): Promise<IconLibrary>;
}
```

### Search Service

The search service provides unified search across all providers:

- **Fuzzy Search**: Powered by Fuse.js with configurable thresholds
- **Caching**: Intelligent caching with TTL and LRU eviction
- **Filtering**: Advanced filtering by library, style, category, and tags
- **Performance**: Optimized for fast response times

## ๐Ÿงช Testing

```bash
# Run all tests
npm test

# Run tests with coverage
npm run test:coverage

# Run integration tests
npm run test:integration

# Run performance tests
npm run test:performance
```

## ๐Ÿ”ง Development

### Setup Development Environment

```bash
git clone https://github.com/your-org/icon-search-mcp.git
cd icon-search-mcp
npm install

# Install icon library dependencies
npm install

# Build the project
npm run build

# Start in development mode
npm run dev
```

### Adding New Icon Libraries

1. Add the library as an NPM dependency:

```bash
npm install new-icon-library
```

2. Create a provider class extending `BaseNpmProvider`:

```typescript
export class NewLibraryProvider extends BaseNpmProvider {
  constructor() {
    super('new-library', 'New Library', '1.0.0', 'new-icon-library', ['icons/*.svg']);
  }

  protected getDescription(): string {
    return 'Description of the new library';
  }

  protected getSourceUrl(): string {
    return 'https://github.com/library/icons';
  }

  protected getLicense(): string {
    return 'MIT';
  }
}
```

3. Register the provider in `src/providers/index.ts`:

```typescript
registry.register(new NewLibraryProvider());
```

4. Add the library configuration to `scripts/build-index.js`:

```javascript
'new-icon-library': {
  name: 'new-library',
  displayName: 'New Library',
  description: 'Description of the new library',
  sourceUrl: 'https://github.com/library/icons',
  license: 'MIT',
  iconPaths: ['icons/*.svg'],
  styles: ['regular'],
}
```

### Code Style

- **TypeScript**: Strict mode enabled
- **ESLint**: Configured with TypeScript rules
- **Prettier**: Consistent code formatting
- **Husky**: Pre-commit hooks for quality checks

## ๐Ÿ“Š Performance

- **Search Speed**: < 100ms for most queries with caching
- **Memory Usage**: Efficient memory management with LRU caching
- **Scalability**: Supports thousands of icons across multiple libraries
- **Fuzzy Search**: Optimized Fuse.js configuration for best performance

## ๐Ÿ”’ Security

- **Input Validation**: All inputs validated with Zod schemas
- **Output Sanitization**: Safe handling of SVG content
- **Error Handling**: Comprehensive error handling without information leakage
- **Dependencies**: Regular security audits and updates

## ๐Ÿค Contributing

1. Fork the repository
2. Create a feature branch: `git checkout -b feature/amazing-feature`
3. Commit your changes: `git commit -m 'Add amazing feature'`
4. Push to the branch: `git push origin feature/amazing-feature`
5. Open a Pull Request

### Development Guidelines

- Write tests for new features
- Follow TypeScript best practices
- Update documentation for API changes
- Ensure all CI checks pass

## ๐Ÿ“„ License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## ๐Ÿ™ Acknowledgments

- [Fuse.js](https://fusejs.io/) for powerful fuzzy search capabilities
- [Model Context Protocol](https://modelcontextprotocol.io/) for the standard protocol
- All the icon library maintainers for their amazing work

## ๐Ÿ“ž Support

- **Issues**: [GitHub Issues](https://github.com/your-org/icon-search-mcp/issues)
- **Discussions**: [GitHub Discussions](https://github.com/your-org/icon-search-mcp/discussions)
- **Documentation**: [Wiki](https://github.com/your-org/icon-search-mcp/wiki)

---

Made with โค๏ธ for the developer community