photo-vlm-mcp
Uses Ollama's vision-capable models to analyze photos, extract text, inspect scenes, compare photos, and extract metadata.
Click on "Deploy 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., "@photo-vlm-mcpExtract text from this whiteboard photo."
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.
photo-vlm-mcp
photo-vlm-mcp is a local, Ollama-backed MCP server that gives coding assistants a
portable photo-understanding toolset:
analyze_photo- ask questions about a real-world photo.photo_ocr- extract text from labels, receipts, whiteboards, signs, and photographed pages.inspect_scene- return structured objects, scene context, visible text, quality, and uncertainty.compare_photos- compare before/after or near-duplicate photos.extract_metadata- read dimensions, orientation, EXIF fields, GPS, and optional SHA-256.health- check Ollama reachability and configured model availability.
It is designed for user-level registration with Claude Code, Codex, Antigravity, Cursor, Cline, Windsurf, Zed, and other MCP clients.
Requirements
Python 3.11+
Ollama running locally
A vision-capable Ollama model
Recommended local models:
ollama pull qwen3-vl:8b
ollama pull minicpm-vIf qwen3-vl:8b is unavailable in your Ollama build, use qwen2.5vl:7b or another
vision model from ollama.com/search?c=vision.
Related MCP server: llm-vision-mcp
Install
Directly from GitHub:
python -m pip install "git+https://github.com/YehudRaanan/photo-vlm-mcp.git"Or run without a persistent install using uvx:
uvx --from "git+https://github.com/YehudRaanan/photo-vlm-mcp.git" photo-vlm-mcp --versionFor local development:
git clone https://github.com/YehudRaanan/photo-vlm-mcp.git
cd photo-vlm-mcp
python -m pip install -e .With optional Tesseract OCR support:
python -m pip install -e ".[tesseract]"Run
photo-vlm-mcpThe server uses MCP over stdio, so it normally runs under an MCP client rather than as a long-lived terminal command.
Helpful local checks:
photo-vlm-mcp --version
photo-vlm-mcp --print-configRegister With Claude Code
claude mcp add photo-vlm --scope user -- photo-vlm-mcpWith explicit model config:
claude mcp add photo-vlm --scope user `
-e OLLAMA_URL=http://127.0.0.1:11434 `
-e PHOTO_VLM_MODEL=qwen3-vl:8b `
-e PHOTO_OCR_MODEL=minicpm-v `
-- photo-vlm-mcpRegister With Codex / Antigravity / Other MCP Clients
Add this server to the client user-level MCP config:
{
"mcpServers": {
"photo-vlm": {
"command": "photo-vlm-mcp",
"env": {
"OLLAMA_URL": "http://127.0.0.1:11434",
"PHOTO_VLM_MODEL": "qwen3-vl:8b",
"PHOTO_OCR_MODEL": "minicpm-v"
}
}
}
}If the console script is not on PATH, use:
{
"command": "python",
"args": ["-m", "photo_vlm_mcp"]
}Configuration
Variable | Default | Meaning |
|
| Ollama endpoint |
|
| Model for analysis, scene inspection, comparison |
|
| Model for VLM OCR |
|
| Default generation limit |
|
| Ollama request timeout in seconds |
|
| Ollama keep-alive setting |
|
| Downscale longest side before inference |
|
| Reject larger images |
|
| URL fetch timeout |
|
| Allow private/loopback URLs |
| unset | Optional path allow-list, separated by |
Legacy aliases VLM_MODEL, OCR_MODEL, and related VLM_* variables are also accepted.
Privacy
extract_metadataomits GPS coordinates unless called withinclude_gps=true.OLLAMA_URLdefaults to localhost. A remote value sends image bytes off this machine.With
PHOTO_VLM_ALLOWED_ROOTSunset, any absolute path is readable; scope it in shared or agent-driven setups. See SECURITY.md.
Reliability Contract
Local VLM output is assistive visual evidence, not a deterministic classifier. For audits, measurements, compliance, or scientific reporting, use structured tables, rasters, metadata, or other deterministic sources as the source of truth.
VLM-backed tools return completion_status, warnings, and diagnostics in addition to
their normal text or JSON payload. Treat completion_status: "possibly_incomplete" as a
signal to retry, simplify the image/prompt, use a stronger model, or fall back to the
deterministic source. diagnostics.done_reason exposes Ollama's finish reason when
available; ollama_stopped_for_length, dangling_terminal_phrase, and
missing_terminal_punctuation warnings indicate weak or suspicious output.
QA
python -m pytest
python -m ruff check src tests scripts
python -m black --check src tests scripts
python -m isort --check-only src tests scriptsThe unit tests mock Ollama and validate image input handling, metadata extraction, prompt construction, and client behavior. Live model quality evaluation belongs in a separate environment with Ollama and selected models installed.
See also:
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
MCP server for Qwen Image 3 AI image generation
MCP server for visual regression testing: triage a PR's UI diffs from your coding agent.
Holiday photo MCP server: list and fetch personal holiday photos inline in Claude chat.
Related MCP Servers
- AlicenseAqualityAmaintenanceA portable image-understanding MCP server that lets agents analyze local images, URLs, or base64 images via an OpenAI-compatible vision model.154 npm72MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that enables any LLM to describe images from file paths, URLs, or base64 data by forwarding them to a supported vision provider such as OpenAI, Anthropic, or local Ollama models.693 npm10MIT
- FlicenseAqualityCmaintenanceMCP server enabling LLM clients without vision capability to process images by delegating to local Ollama vision models. Supports describing images, OCR, asking questions, and processing clipboard images.4-
- FlicenseAqualityDmaintenanceMCP server for vision capabilities, enabling screenshot, camera, and image analysis using Ollama vision models.41-