InsightFace-MCP
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@InsightFace-MCPfind photos of Alice in my Events folder"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
InsightFace-MCP
A fully local, offline facial recognition search system for your photo library. It plugs into LM Studio via MCP (Model Context Protocol), so you can ask an LLM things like:
"Find all pictures of this person in my Events folder."
...and get back every matching photo, with confidence scores, without a single image or embedding ever leaving your machine.
LM Studio
│ MCP tools
▼
Python MCP Server (server.py)
├── InsightFace → detect faces, generate embeddings
├── FAISS → store embeddings, fast similarity search
└── Events/ → recursively scanned photo library1. Project structure
InsightFace-MCP/
├── server.py # MCP server (the entry point LM Studio launches)
├── face_engine.py # shared helpers (model loading, I/O, FAISS, metadata)
├── index_faces.py # scans Events/ and builds the face database
├── search_faces.py # searches the database for a reference face
├── cluster_faces.py # optional: group faces without a reference photo
├── config.py # all settings live here
├── requirements.txt
├── README.md
├── database/
│ ├── faces.index # FAISS vector index (created on first run)
│ ├── metadata.json # per-face metadata (created on first run)
│ └── file_cache.json # mtimes, for incremental re-indexing
├── known_faces/ # (optional) put reference photos here
└── Events/ # <- put your photo library here (or point config.py at it)Related MCP server: MCP HydroCoder Vision
2. Installation (Windows)
2.1 Prerequisites
Python 3.10 or 3.11 (64-bit). Check with
python --version.(Optional, for GPU speed) An NVIDIA GPU with a recent driver, plus a matching CUDA runtime. CPU-only works fine too, just slower on large libraries.
2.2 Create a virtual environment
Open PowerShell in the InsightFace-MCP folder:
python -m venv venv
venv\Scripts\activate2.3 Install dependencies
pip install --upgrade pip
pip install -r requirements.txtNotes:
If you do not have an NVIDIA GPU, edit
requirements.txtfirst: comment outonnxruntime-gpuand uncommentonnxruntime. Then re-run the install command. The server auto-detects whether CUDA is available and falls back to CPU either way, but installing the plain CPU package avoids downloading unused CUDA binaries.The first time InsightFace runs, it will automatically download the
buffalo_lmodel pack (~300MB) from its own model repository (this is a one-time model download, not a cloud inference call — after this, all face detection/embedding happens locally with no further network access).pillow-heifgives you HEIC/HEIF (iPhone photo) support. If installation fails on your system, everything else still works — HEIC files will just be skipped with a warning.
2.4 Point the server at your photo library
Open config.py and set EVENTS_FOLDER, e.g.:
EVENTS_FOLDER = Path(r"C:\Users\yourname\Pictures\Events")Or set an environment variable instead of editing the file:
setx EVENTS_FOLDER "C:\Users\yourname\Pictures\Events"The folder is scanned recursively — every nested subfolder, no matter how
deep, is included. Supported formats: JPG, JPEG, PNG, WEBP, BMP, TIFF, and
HEIC/HEIF (if pillow-heif installed successfully).
2.5 Build the initial database
You can do this once up front (recommended for large libraries), or just let
LM Studio call index_events_folder() the first time you ask it to search.
python index_faces.pyFor 10,000+ photos, expect this to take a while on first run (minutes to tens of minutes depending on CPU/GPU). Subsequent runs are incremental and only process new/changed files.
2.6 (Optional) Add known reference photos
Drop a clear, front-facing photo of each person into known_faces/, e.g.
known_faces/alice.jpg. You can then just say "find Alice" in LM Studio and
point it at that file — see usage examples below.
3. LM Studio MCP setup
LM Studio supports MCP servers via its mcp.json configuration (Program
Files / Integrations, depending on your LM Studio version — check LM
Studio's own docs for the exact menu, since this changes between versions).
Add an entry like this, adjusting paths to match your machine:
{
"mcpServers": {
"insightface-events-search": {
"command": "C:\\path\\to\\InsightFace-MCP\\venv\\Scripts\\python.exe",
"args": ["C:\\path\\to\\InsightFace-MCP\\server.py"],
"env": {
"EVENTS_FOLDER": "C:\\Users\\yourname\\Pictures\\Events"
}
}
}
}Key points:
Use the full path to the venv's
python.exe, not justpython, so LM Studio uses the environment withinsightface/faissinstalled.argsmust point at the full path toserver.py.The
envblock is optional if you already setEVENTS_FOLDERinconfig.pydirectly.
Restart LM Studio (or reload MCP servers) after editing the config. You
should see insightface-events-search listed as a connected MCP server with
four tools: find_person, index_events_folder, database_status, and
list_clusters.
4. Usage examples (in LM Studio chat)
Once connected, you can just talk naturally:
"Search my Events folder for this face" — attach/reference a photo, and the model will call
find_personwith that image path."Show me every event where this person appears" — same tool, phrased differently; the LLM decides to call
find_person."Rebuild the face database" — triggers
index_events_folder."How many photos have you indexed so far?" — triggers
database_status."Who shows up most often in my photos?" — triggers
list_clustersto explore recurring faces without needing a reference photo first.
Note: exactly how you supply the reference image path depends on your LM
Studio version's file-attachment / tool-argument behavior. The simplest
reliable approach: save a reference photo into known_faces/, e.g.
known_faces/mom.jpg, then say:
"Find every photo of the person in known_faces/mom.jpg"
The find_person tool will resolve that relative path automatically.
5. How it works
Indexing (
index_faces.py)Recursively walks
EVENTS_FOLDERwithos.walk, which by design never skips subdirectories.Loads each supported image (via Pillow, so HEIC/WEBP/TIFF all work consistently), converts to the BGR array format InsightFace/OpenCV expect.
Runs InsightFace's
buffalo_ldetector, which returns bounding boxes, detection confidence, and a 512-dimension ArcFace embedding per face.Faces below
MIN_DETECTION_SCORE(config.py) are discarded as low-confidence/noise.Each embedding is L2-normalized, then added to a FAISS
IndexFlatIP(inner product on normalized vectors = cosine similarity) wrapped inIndexIDMap2so each vector has a stable integer ID.Metadata per face (source file, filename, face index within that image, EXIF timestamp if present, bounding box, detection score) is stored in
metadata.json, keyed by that same integer ID.File modification times are cached in
file_cache.json; on subsequent runs, unchanged files are skipped entirely (incremental indexing), and changed files have their old faces removed and re-added.
Searching (
search_faces.py)Loads your reference photo, detects the (largest, most prominent) face in it, and computes its normalized embedding the same way.
Queries the FAISS index for the most similar stored embeddings.
Groups results by source image (since one photo can contain multiple faces, and the same person might appear more than once in a group photo), keeping the best-matching face's score as that image's confidence.
Filters by
thresholdand returns results sorted by confidence, descending.
Serving (
server.py)Wraps the above in an MCP server using
FastMCP, exposingfind_person,index_events_folder,database_status, andlist_clustersas callable tools with clear docstrings so the LLM in LM Studio understands when and how to call each one.Runs over stdio, which is what LM Studio expects for locally-launched MCP servers.
No network calls are made at query time. The only network access ever used is the one-time InsightFace model download on first run.
6. Performance notes
FAISS
IndexFlatIPdoes an exact (not approximate) similarity search. For libraries up to roughly 100k-200k faces this is still fast (a few milliseconds to tens of milliseconds per query) since it's just a matrix multiply. If your library grows far beyond that, consider switching the index type inface_engine.new_empty_index()to an approximate index likeIndexIVFFlatorIndexHNSWFlatfor sub-linear search time.GPU vs CPU:
face_engine.get_face_app()automatically tries CUDA viaonnxruntime'sCUDAExecutionProviderfirst, and transparently falls back to CPU if CUDA isn't available or fails to initialize. No configuration needed — check the server's stderr log line on startup to confirm which provider was used.Incremental indexing: re-running
index_events_folder()after adding a handful of new photos to a 10,000-photo library only processes the new files, not the whole set.Batching: detection is done one image at a time (InsightFace's
FaceAnalysis.get()is per-image), which is the standard approach for variable-resolution photo libraries and keeps memory use predictable even on large folders.
7. Troubleshooting
"No module named 'insightface'" or similar import errors
Make sure you activated the venv (venv\Scripts\activate) before running
anything, and that LM Studio's mcp.json points at the venv's python.exe,
not your system Python.
Server doesn't show up in LM Studio
Double-check
mcp.jsonpaths use double backslashes (\\) or forward slashes, and are absolute paths.Try running
python server.pymanually in your terminal first — if it crashes, LM Studio will fail silently. Fix any errors shown there first.
"CUDAExecutionProvider" not found / falls back to CPU unexpectedly
Confirm
onnxruntime-gpuinstalled successfully (pip show onnxruntime-gpu).Confirm your NVIDIA driver + CUDA toolkit versions are compatible with the installed
onnxruntime-gpuversion (check onnxruntime's release notes).This isn't fatal — CPU fallback still works, just slower.
HEIC files are being skipped
Confirm
pillow-heifinstalled:pip show pillow-heif.Some very new/exotic HEIC variants (e.g. certain burst-mode formats) may still fail to decode; check the server log for the specific error.
database_status shows database_healthy: false
This means the FAISS index and metadata.json have drifted out of sync (e.g. a crash mid-write). Run
python index_faces.py --fullto rebuild cleanly from scratch.
Searches return no matches / too many false positives
Too few matches: lower
threshold(e.g. from 0.45 to 0.35) when callingfind_person, or use a clearer, well-lit, front-facing reference photo.Too many false positives: raise
threshold(e.g. to 0.55-0.6).Faces at extreme angles, heavy occlusion (masks, sunglasses), or very low resolution are inherently harder to match — this is a property of any face-recognition model, not specific to this setup.
Indexing is very slow
Confirm you're actually using the GPU if you have one (check startup log).
For very large libraries, consider running
index_faces.pydirectly from the terminal once (rather than through LM Studio) so you can watch thetqdmprogress bar and confirm throughput.
"No face detected in reference image"
Use a photo where the face is reasonably large, front-facing, and not heavily obscured. Cropping the reference photo tighter around the face can help.
8. Privacy & security
Everything — model inference, embedding generation, similarity search — runs on your machine.
No images, embeddings, or metadata are uploaded anywhere.
The only outbound network request in the entire system is InsightFace's one-time model weight download the first time it runs (standard for any local ML library); after that, the server works fully offline.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/PonziFi/InsightFace-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server