Your Mac screenshots folder is a disaster. This fixes it — with vision, embeddings, and semantic search.
Project description
snapsearch
Your Mac screenshots folder is a disaster. This fixes it — with vision, embeddings, and semantic search.
An AI agent + custom MCP server that sees your screenshots, understands what's in them, organizes them into clean folders, and lets you find anything with natural language.
Fully local. No cloud uploads. No subscriptions.
✨ Features
- Context-Aware Organization: Unlike scripts that blindly rename files, this agent understands context and categorizes intelligently.
- Semantic Search: Find screenshots by meaning (e.g., "that slack message about the deploy"), even with garbage filenames.
- Adaptive: Tell it to "actually split design into figma vs other" and it re-organizes on the fly.
- Persistent Memory: Decisions are remembered across sessions using a local ChromaDB.
🚀 Quickstart (No Clone Needed!)
Using uvx (the modern Python alternative to npx), you can run snapsearch instantly without manual cloning or pip installs.
1. Set your Environment Variables
You need to provide your OpenAI API key and optionally your screenshots directory. You can set them in your environment:
export OPENAI_API_KEY="sk-..."
export SCREENSHOTS_DIR="/Users/yourname/Desktop" # Optional, defaults to ~/Desktop/screenshots-demo
2. Run the Agent
Trigger the autonomous organizer right away with these commands:
# Full auto-organize (scan → vision → embed → move → rename)
uvx snapsearch
# Semantic search queries
uvx snapsearch "find my react error screenshots"
uvx snapsearch "show me figma mockups from last month"
uvx snapsearch "that slack conversation about the deployment"
# Partial organize
uvx snapsearch "organize only the code screenshots"
# Index health check
uvx snapsearch --stats
🤖 How it works
Behind the scenes, snapsearch builds a powerful pipeline to understand your images:
- 🖼️ screenshot.png
- 👁️ GPT-4o vision → "React error about invalid hook call in App.js, line 23"
- 🔢 text-embedding-3-small →
[0.021, -0.847, 0.334, ...] - 💾 ChromaDB (local) → Stored permanently on disk
- 🔍 search("hooks problem") → Finds it instantly!
The Resulting Organization
Your chaotic screenshots folder turns into a clean, categorized structure:
- 📂 ~/Screenshots/
- 📁 code/
- 📁 errors/
- 📄
react-hooks-invalid-call.png - 📄
python-importerror-requests.png
- 📄
- 📁 snippets/
- 📄
vim-config-lsp-setup.png
- 📄
- 📁 errors/
- 📁 design/
- 📁 figma/
- 📄
darkmode-mobile-v3.png
- 📄
- 📁 other/
- 📄
canva-instagram-post.png
- 📄
- 📁 figma/
- 📁 chats/
- 📄
whatsapp-trip-planning-march.png
- 📄
- 📁 docs/
- 📄
notion-q2-sprint-board.png
- 📄
- 📁 memes/
- 📄
drake-hotline-bling-coding.png
- 📄
- 📁 web/
- 📄
vercel-deployment-dashboard.png
- 📄
- 📁 code/
🛠️ Architecture
- 🤖 snapsearch (Agent)
- 🔌 Connects via MCPServerStdio to:
- ⚙️ snapsearch-mcp (MCP server — 8 tools)
- 👁️
vision.py— GPT-4o vision to structured descriptions - 🧠
embeddings.py— OpenAI embeddings & ChromaDB operations - 🧱
models.py— Pydantic data models
- 👁️
MCP Tools Available
| Tool | Description |
|---|---|
scan_screenshots |
List all images + metadata |
read_screenshot |
Return base64 image for direct visual inspection |
describe_and_index |
Main tool — GPT-4o vision + ChromaDB embedding |
search_screenshots |
Semantic search (meaning, not filenames) |
move_screenshot |
Move to category subfolder, updates index |
rename_screenshot |
Human-readable rename, updates index |
list_categories |
Folder structure + counts |
index_stats |
ChromaDB health check |
🔌 Use in Claude Desktop (MCP server only)
Because it's distributed on PyPI, using it in Claude Desktop is extremely simple.
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"snapsearch": {
"command": "uvx",
"args": ["snapsearch-mcp"],
"env": {
"SCREENSHOTS_DIR": "/Users/yourname/Desktop",
"OPENAI_API_KEY": "sk-..."
}
}
}
}
🔒 Privacy & Data
| Component | Location |
|---|---|
| ChromaDB index | ~/.snapsearch/chroma/ |
| Your screenshots | wherever SCREENSHOTS_DIR points |
| Cloud Uploads | None. Nothing is uploaded anywhere. |
🏗️ Stack
- MCP server —
mcpPython SDK v1.27+ - Agent — OpenAI Agents SDK v0.17+
- Vision —
gpt-4o(low detail mode — fast + cheap) - Embeddings —
text-embedding-3-small - Vector DB — ChromaDB (local, persistent)
- Validation — Pydantic v2
📄 License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file snapsearch_mcp-0.1.1.tar.gz.
File metadata
- Download URL: snapsearch_mcp-0.1.1.tar.gz
- Upload date:
- Size: 19.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
530100bb7b6c3ca2fbdba5cb2db345996c68a0bfc9c6bb60133f0504f564d4ee
|
|
| MD5 |
24b124415ff1896587afd1008e2ac311
|
|
| BLAKE2b-256 |
dc46f2a15f9e640d1e802fc79a9128bb296240160b4d40090ebfa11226fa0edd
|
File details
Details for the file snapsearch_mcp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: snapsearch_mcp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 21.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f047479683b4e17e8747beb2e73086a70bc94a9c122372a726cdb6f6f5e98a3
|
|
| MD5 |
4ebab7cd2134687b5676d060eec173e0
|
|
| BLAKE2b-256 |
d47cc59d4ba0f79f8790554dcb6e5e8c4550b3481ab82877fdbcb8d827e892f0
|