使用说明
Local Image Search MCP
Have you ever struggled to find a specific image buried somewhere in your local directories? This MCP server is your solution.
Local Image Search MCP is a Model Context Protocol (MCP) server that enables Claude and other AI assistants to search through your local image collections using natural language. Ask questions like "find screenshots with Python tracebacks" or "show me photos with dogs on the beach", and get instant results based on the actual content of your images—not just filenames.
🎯 What This Does
Local Image Search MCP scans your local directories, analyzes each image using OCR, computer vision, and semantic embeddings, then stores everything in a local SQLite database. Claude can then search through your images using natural language queries that understand:
- Visual content: "find images with red cars" or "photos of mountains"
- Text inside images: "screenshots containing 'error 500'" or "receipts from March"
- Semantic concepts: "diagrams or whiteboard photos" or "invoices and bills"
- Combined queries: "Python code screenshots from last week"
[!WARNING] Privacy Notice: When using API mode, your images and their content will be sent to external cloud services (e.g., OpenAI) for processing. This means private, sensitive, or personal images will be exposed to third-party APIs. Use API mode at your own risk and only with images you're comfortable sharing externally. For maximum privacy, we strongly recommend using local mode (the default), which processes all images entirely on your machine without sending any data to external services. Local models are fully enabled and supported in this repository.
✨ Key Features
- 🔒 Privacy-first & Local: All data stays on your machine
- 🧠 Smart Search: Hybrid search combining semantic similarity, OCR text matching, and metadata filters
- 🏃 Incremental Indexing: Only reprocesses changed files
- 🎨 Multi-format Support: JPEG, PNG, WebP, HEIC, GIF, BMP, TIFF
- 📊 Rich Metadata: Extracts EXIF, dimensions, timestamps, and generates captions
- 🔍 Visual Similarity: Find images visually similar to a reference image
- ⚡ Production-Ready: Robust error handling, logging, and batch processing
🏗️ Architecture
The project follows a clean separation inspired by whatsapp-mcp:
Design Philosophy:
- Indexer: Scans directories, analyzes images, extracts metadata, generates embeddings
- MCP Server: Exposes search and management tools to Claude Desktop/Cursor
- Storage: SQLite for all metadata, OCR text, captions, tags, and embeddings
- Modularity: Swap OCR/captioning/embedding providers via adapter pattern
🔧 Installation
Prerequisites
- Python 3.10 or higher
- Tesseract OCR (for text extraction)
- 2-4 GB free disk space for ML models (first run only)
1. Install Tesseract OCR
macOS:
brew install tesseract
Ubuntu/Debian:
sudo apt-get install tesseract-ocr
Windows: Download and install from GitHub releases, then add to PATH.
2. Clone & Install
# Clone the repository
git clone https://github.com/edujbarrios/local-image-search-mcp.git
cd local-image-search-mcp
# Create virtual environment
python -m venv venv
# Activate virtual environment
# On macOS/Linux:
source venv/bin/activate
# On Windows:
.\venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
3. Configure Environment
# Copy example config
cp .env.example .env
# Edit .env with your preferences (optional)
# Default settings work for most users
4. Initialize Database
The database is automatically initialized the first time the server runs. You can also do it manually:
python -c "from database_schema import initialize_database_sync; initialize_database_sync('./image_search.db')"
🚀 Usage with Claude Desktop
Configure Claude Desktop
Add the following to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"image-search": {
"command": "/absolute/path/to/local-image-search-mcp/venv/bin/python",
"args": [
"-m",
"image_mcp_server.server"
],
"env": {
"PYTHONPATH": "/absolute/path/to/local-image-search-mcp",
"DATABASE_PATH": "/absolute/path/to/local-image-search-mcp/image_search.db",
"IMAGE_ANALYSIS_MODE": "local",
"LOG_LEVEL": "INFO"
}
}
}
}
Important: Replace /absolute/path/to/local-image-search-mcp with your actual installation path.
Restart Claude Desktop
After updating the configuration, restart Claude Desktop for changes to take effect.
🚀 Usage with Cursor
Configure Cursor
Add to your Cursor MCP settings (Settings → MCP):
{
"mcpServers": {
"image-search": {
"command": "/absolute/path/to/local-image-search-mcp/venv/bin/python",
"args": ["-m", "image_mcp_server.server"],
"env": {
"PYTHONPATH": "/absolute/path/to/local-image-search-mcp",
"DATABASE_PATH": "/absolute/path/to/local-image-search-mcp/image_search.db"
}
}
}
}
📚 Available Tools
Once configured, Claude can use these tools:
scan_directory
Index a directory of images for searching.
Claude: scan the directory /Users/john/Pictures/Screenshots
search_images
Search for images using natural language.
Claude: find images with Python error messages
Claude: show me receipts from the last month
Claude: find photos with people wearing red
get_image_details
Get detailed information about a specific image.
Claude: show me details for /Users/john/Pictures/photo.jpg
find_similar_images
Find visually similar images.
Claude: find images similar to /Users/john/Pictures/sunset.jpg
reindex_changed_files
Reindex files that have changed.
Claude: reindex changed files in /Users/john/Documents
list_indexed_directories
List all indexed directories.
Claude: show me all indexed directories
remove_indexed_directory
Remove a directory from the index.
Claude: stop indexing /Users/john/Old Pictures
get_statistics
Get statistics about the image index.
Claude: show me image index statistics
💡 Example Queries
Once your images are indexed, you can ask Claude:
- "Find screenshots with Python tracebacks"
- "Show me invoices or receipts from March"
- "Find images with dogs on the beach"
- "Look for photos with a red car"
- "Find diagrams or whiteboard photos"
- "Search for images containing the text 'reservation confirmed'"
- "Show me images similar to this screenshot"
- "Find photos taken with an iPhone"
- "Look for images wider than 1920 pixels"
⚙️ Configuration
Environment Variables
| Variable | Default | Description |
|---|---|---|
DATABASE_PATH |
./image_search.db |
SQLite database location |
IMAGE_ANALYSIS_MODE |
local |
Analysis mode: local, api, or hybrid |
MAX_WORKERS |
4 |
Number of parallel indexing workers |
BATCH_SIZE |
10 |
Images processed per batch |
LOG_LEVEL |
INFO |
Logging level |
Analysis Modes
-
local(default): Uses local ML models (BLIP, CLIP, Tesseract)- Pros: Free, private, no API limits
- Cons: Slower, requires model downloads (~2GB first run)
-
api: Uses cloud APIs (OpenAI Vision, etc.)- Pros: Faster, better quality
- Cons: Costs money, requires API keys, sends images externally
- Note: API mode not yet fully implemented
-
hybrid: Mix of local and API- Future: Use local for basic tasks, API for complex ones
🗄️ Storage
All data is stored in a single SQLite database file:
- Images table: File paths, hashes, dimensions, timestamps
- OCR text: Extracted text with confidence scores
- Captions: Generated descriptions of image content
- Tags: Automatically extracted keywords
- Embeddings: 512-dimension CLIP vectors for semantic search
- EXIF data: Camera settings, GPS, etc.
- Full-text search indices: For fast text queries
Database Location
By default: ./image_search.db
You can move it anywhere and update DATABASE_PATH in your configuration.
🔒 Security Considerations
What Claude Can Access:
✅ Read any indexed image metadata, captions, OCR text
✅ Search your indexed images by content
✅ Scan any local directory you ask it to
✅ View full file paths of indexed images
❌ Cannot access files outside indexed directories
❌ Cannot modify or delete images
❌ Cannot execute arbitrary code
Privacy:
- All processing happens locally (in
localmode) - No images are sent to external services (unless using
apimode) - Database contains only paths, not image data
- You control which directories are indexed
Best Practices:
- Only index directories you're comfortable exposing to Claude
- Be aware that Claude will see full file paths
- Review indexed directories periodically
- Use
remove_indexed_directoryfor sensitive folders
🐛 Troubleshooting
"No images found"
-
Make sure you've indexed a directory first:
Claude: scan the directory /path/to/images -
Check if images are actually indexed:
Claude: show me statistics
"Tesseract not found"
Install Tesseract OCR (see Installation section) and ensure it's in your PATH:
# Test if Tesseract is available
tesseract --version
Slow indexing
- Reduce
MAX_WORKERSin.envif system is overloaded - OCR and captioning are CPU-intensive; first-time indexing takes time
- Models are downloaded on first run (~2GB); subsequent runs are faster
Server not appearing in Claude
- Check the configuration file path
- Verify Python virtual environment path is absolute
- Restart Claude Desktop completely
- Check Claude logs:
- macOS:
~/Library/Logs/Claude/mcp*.log - Windows:
%APPDATA%\Claude\Logs\mcp*.log
- macOS:
"Import error" or "Module not found"
Ensure PYTHONPATH is set correctly in MCP configuration:
"env": {
"PYTHONPATH": "/absolute/path/to/image-mcp"
}
🛣️ Roadmap
- [ ] Web UI for browsing indexed images
- [ ] Support for PDF page rasterization
- [ ] Video frame extraction and indexing
- [ ] Face detection and recognition
- [ ] API mode with OpenAI Vision
- [ ] Near-duplicate detection using perceptual hashes
- [ ] Advanced filters (date ranges, camera settings, etc.)
- [ ] Export/import index functionality
- [ ] Docker containerization
🤝 Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Follow existing code style (Black, type hints, docstrings)
- Add tests for new functionality
- Submit a pull request
📄 License
MIT License - see LICENSE file for details.
🙏 Acknowledgments
- Inspired by whatsapp-mcp architecture
- Built with MCP Python SDK
- Uses BLIP for image captioning, CLIP for embeddings, Tesseract for OCR
📞 Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Made with ❤️ for Claude and the MCP community