Local Eyes
Provides a cloud vision backend via Google's Gemini API using a Gemma model, enabling image analysis through the same Local Eyes tools when configured with a Gemini API key.
Provides a local/offline vision backend via Ollama running Gemma 4, enabling the read_ui, extract_text, and describe_image tools to analyze images without sending them to the cloud.
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., "@Local Eyesread this UI screenshot ~/Desktop/broken_form.png and tell me why sign-up fails"
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.
Local Eyes 👁️
Private eyes for text-only AI agents. Local Eyes is an MCP server that lets any agent or model see images, using Gemma 4 running on your own machine (Ollama) or through the Gemini API.
Frontier models can already see. But many of the open models people run locally for coding and agents are text-only (gpt-oss, DeepSeek, Qwen-Coder), and private or offline setups can't send screenshots to a cloud model. Local Eyes plugs Gemma 4's vision into any MCP client as three tools that return strict JSON. A text-only agent can then read a broken UI, a stack-trace screenshot or a photo of a receipt, without the image ever leaving the laptop.
text-only agent ──MCP──▶ Local Eyes ──▶ Gemma 4 (Ollama, on this machine)
(gpt-oss, Qwen, read_ui └─ or gemma-4-31b-it on the Gemini API
Claude, Cursor…) extract_text
describe_image ◀── validated JSON (Pydantic), 1 auto-retryTools
Tool | Input | Returns |
| UI screenshot |
|
| any image |
|
| path or URL |
|
Every result is validated against a Pydantic schema. If the model returns invalid JSON, Local Eyes retries once and sends back the exact validation error. On Ollama, the schema is also enforced while the model writes its answer (structured outputs). Each result carries _meta with the backend, model, latency, attempts and whether it came from the cache.
Related MCP server: vision-mcp
Setup
Requires Python 3.10+ and uv.
git clone https://github.com/Arcanum703/local-eyes && cd local-eyes
uv sync
cp .env.example .env # pick a backend; add GEMINI_API_KEY if using geminiPrivate mode (Ollama, works offline):
ollama pull gemma4:e4bCloud mode (Gemini API): set LOCAL_EYES_BACKEND=gemini and GEMINI_API_KEY=... (from AI Studio) in .env. The default model is gemma-4-31b-it.
Try it without an MCP client:
uv run local-eyes-cli read_ui demo/broken_form.pngConnect to any MCP client
Claude Code (3 lines):
claude mcp add local-eyes -- uv --directory /path/to/local-eyes run local-eyesClaude Desktop / Cursor / any MCP client (mcpServers entry):
"local-eyes": {
"command": "uv",
"args": ["--directory", "/path/to/local-eyes", "run", "local-eyes"]
}Add "--backend", "gemini" or "--cache" to the args to change behaviour, or set LOCAL_EYES_BACKEND in .env.
Replay cache (--cache)
With --cache, every validated response is saved to cache/<hash>.json. The key is the image bytes + tool + question, so the backend doesn't matter. The next identical call is answered from disk instantly, with no model and no network. This keeps a live demo working through rate limits or dead conference Wi-Fi. Cached results show "_meta": {"cached": true}. Answers for the demo images ship in cache/.
Demo: a text-only agent fixes a broken form
scripts/agent_demo.py is a ~80-line agent harness. Its "brain" is any Ollama model with tool calling, and it never receives image bytes, only Local Eyes' JSON:
AGENT_MODEL=gpt-oss:20b uv run python scripts/agent_demo.py demo/broken_form.png "Why can't the user sign up? Propose a fix." --cacheThe agent calls read_ui, learns about the invalid email, the mismatched passwords, the 422 date_of_birth expected YYYY-MM-DD banner and the submit button hanging off the card, then proposes the fix. With Ollama it all works with Wi-Fi off.
Other demo images: demo/stacktrace.png (try extract_text on it).
scripts/mcp_smoke.py <tool> <image> [--cache] [--backend gemini] exercises the server exactly like an MCP client does.
Configuration
Env var | Default | |
|
|
|
|
| |
|
| any Ollama vision model |
| required for | |
|
| |
| off |
|
|
| |
|
| images are downscaled to this before sending |
| unset | if set, local paths must be inside this folder |
| off | URLs to localhost/private networks are refused by default |
Only files that decode as images are ever sent to a model (25 MB / 50 MP caps).
License
MIT. Built at MLH Hacktoberfest Hack Day Budapest, 31 Oct 2026.
This server cannot be deployed
Maintenance
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
- mcpOAuthcom.screenshotink
Screenshot, diff, audit and sitemap-capture any web page — 5 MCP tools for AI agents.
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
MCP tools for AI agents: render URLs to image/PDF, check link health, convert HTML/CSV/JSON.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables non-multimodal models to see images by providing MCP tools for image understanding and OCR, backed by any OpenAI-compatible vision model.2MIT
- AlicenseNot gradedqualityCmaintenanceAdds image recognition and UI grounding capabilities to text-only LLMs through MCP tools, supporting local and cloud vision backends.21 npmMIT
- AlicenseAqualityBmaintenanceVision MCP enables text-only agents to understand images through any OpenAI-compatible vision model. It supports local images, URLs, screenshots, documents, charts, and code errors with tools like analyze_image and understand_image.2MIT
- AlicenseNot gradedqualityBmaintenanceGives text-only LLMs local vision by providing a local VLM and OCR via MCP, enabling agents to analyze screenshots and extract text from images.MIT