ollama-vision-mcp
Capabilities:
Analyze images – provide a path to a local image (PNG, JPG, WebP, etc.) and receive a detailed textual description.
Customize analysis – supply a custom prompt to steer the description (e.g., focus on UI bugs).
Choose vision model – select any Ollama vision model (default:
kimi-k2.6:cloud), connecting to a local instance or Ollama Cloud.Integrate with MCP – works with MCP clients (Claude Code, Cursor, etc.) to give text-only LLMs vision-like understanding of screenshots, diagrams, and more.
Provides an analyze_image tool that sends local images to a vision-capable Ollama model and returns the model's textual description, giving vision capabilities to text-only LLMs.
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., "@ollama-vision-mcpanalyze this screenshot of the bug and tell me what's wrong"
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.
Ollama Vision MCP
A Python MCP server that gives vision
capabilities to a text-only LLM. It exposes a single tool, analyze_image,
that sends a local image to a vision-capable Ollama model and returns the
model's textual description.
Works with Claude Code, Cursor, and any MCP client that can launch a stdio command.
Motivation
deepseek-v4-flash:0731 is fast and capable, but it is a text-only model
— it has no vision capability, so it can't look at screenshots, UI bugs, or
diagrams on its own. Rather than switch to a heavyweight vision model for
every task, this server bridges the gap: when the text-only LLM needs to
"see" an image, analyze_image sends it to a vision-capable Ollama model
(kimi-k2.6 by default — served by Ollama Cloud or a local instance) and
returns the visual details as text the text-only model can then reason about.
Related MCP server: vision-mcp
Prerequisites
Python 3.10+ with uv (recommended) or pip
Access to an Ollama instance serving a vision model — either:
Ollama Cloud (no local daemon): export
OLLAMA_HOST=https://ollama.comandOLLAMA_API_KEY=<your key>in your shell profile, ora local Ollama with a vision model pulled:
ollama serve & ollama pull kimi-k2.6
Quick start
# 1. Get the code
git clone https://github.com/wzul/ollama-vision-mcp.git
cd ollama-vision-mcp
# 2. Install dependencies
uv sync
# 3. Test it standalone
uv run python tests/test_e2e.pyThen register the server in your MCP client. For Claude Code, the CLI registers it at user scope (available in every project):
claude mcp add --scope user ollama-vision-mcp -- /absolute/path/to/ollama-vision-mcp/.venv/bin/ollama-vision-mcpScope gotcha: without
--scope user,claude mcp addregisters at the project-local scope only — the tool silently won't load from other directories.
Or add this to the top-level mcpServers object in ~/.claude.json (the
top-level object is the user scope; see
Registering):
"ollama-vision-mcp": {
"command": "uvx",
"args": ["--from", "/absolute/path/to/ollama-vision-mcp", "ollama-vision-mcp"]
}💡 Easiest install: if you have Claude Code, just ask it to run the
install-ollama-vision-mcpskill (ships in.claude/skills/in this repo) — it checks prerequisites, writes the config, and verifies the connection for you.
Running as an MCP server (stdio)
uv run ollama-vision-mcpor directly from source:
.venv/bin/python ollama_vision_mcp/server.pyTool: analyze_image
Argument | Type | Required | Default |
| string | yes | — (absolute or relative path; PNG, JPG, WebP, …) |
| string | no |
|
| string | no |
|
Logic: validates the path exists → opens the image with Pillow (normalized to
RGB/PNG) → sends it base64-encoded alongside the prompt via ollama.chat() →
returns the model's text response.
Registering in ~/.claude.json
Add an mcpServers entry for this server (replace
/path/to/ollama-vision-mcp with your actual clone location). Two options:
Option A — uvx (runs in an isolated ephemeral environment)
{
"mcpServers": {
"ollama-vision-mcp": {
"command": "uvx",
"args": [
"--from",
"/path/to/ollama-vision-mcp",
"ollama-vision-mcp"
]
}
}
}uvx builds the local project each launch (cached). If the package is
published to PyPI, "--from", "ollama-vision-mcp" works instead.
Option B — standard Python execution (existing project venv)
{
"mcpServers": {
"ollama-vision-mcp": {
"command": "/path/to/ollama-vision-mcp/.venv/bin/python",
"args": [
"/path/to/ollama-vision-mcp/ollama_vision_mcp/server.py"
]
}
}
}For a system-wide Python instead of the project venv, install the package
first (uv tool install --from . ollama-vision-mcp or pip install .) and
point command at the ollama-vision-mcp executable.
JSON gotcha:
~/.claude.jsonis a single big JSON object. ThemcpServersblock already exists — add the server as a new key inside it, and make sure you don't leave a trailing comma after the last entry.
Scope gotcha: the top-level
mcpServersobject is the user scope (available in every project). If you register via the CLI instead, pass--scope user—claude mcp adddefaults to the project-local scope, which only loads when Claude Code starts from that project's directory.
Ollama Cloud: the server reads
OLLAMA_HOST(defaulthttp://localhost:11434) andOLLAMA_API_KEYfrom the environment. For the cloud, exportOLLAMA_HOST=https://ollama.comin your shell profile — no local daemon orollama pullneeded. The default model iskimi-k2.6(the:cloudtag does not exist on the cloud catalog).
After editing, restart Claude Code (or reload MCP servers). The
analyze_image tool will then be available to the text-only LLM.
Testing
uv run python tests/test_e2e.pySpawns the server over stdio via mcp.client.stdio, verifies tool
registration, runs analyze_image against a locally generated test image with
both the default and a custom prompt, and checks error handling for a missing
file.
License
MIT
Available Tools
1 toolanalyze_imageA
Analyzes local images or screenshots using a vision-capable LLM and returns a detailed textual description.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | kimi-k2.6:cloud | |
| prompt | No | Describe this image in detail for a coding context. | |
| image_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must fully disclose behavioral traits. It states that the tool uses a vision-capable LLM and returns a textual description, but it does not mention potential side effects, network requirements, or that the image is not modified. The description provides essential but minimal behavioral information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that conveys the tool's purpose without any superfluous words. It is concise and front-loaded, making it easy for an agent to quickly grasp the core function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the fundamental purpose but leaves gaps in parameter guidance and usage scenarios. The output schema exists, so return values are handled, but the tool's three parameters and potential configurable behavior are not explained. For a relatively simple tool, it is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the parameters. It implies that 'image_path' refers to a local image file, but the 'model' and 'prompt' parameters are completely unaddressed. This is a significant gap because the description fails to compensate for the lack of schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: it 'Analyzes local images or screenshots using a vision-capable LLM and returns a detailed textual description.' This provides a specific verb (analyzes), resource (local images/screenshots), and outcome, which is unambiguous and distinguishes it from any potential alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: when you need to analyze a local image or screenshot and get a textual description. It does not exclude any specific cases, and with no sibling tools, explicit alternatives are not needed. However, it lacks guidance on prerequisites or when this tool would be inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.0- First observed
analyze_image
TDQS
Scored across 1 tool
Only one tool exists, so there is no possibility of confusion or overlap with other tools.
The tool name follows a clear verb_noun pattern (analyze_image), which is consistent and descriptive.
With only one tool, the server feels thin and on the borderline of being too minimal, though the focus is narrow.
The core image analysis use case is covered, but the absence of features like model selection, batch processing, or multi-image comparison represents minor gaps.
Maintenance
Related MCP Connectors
MCP server for Qwen Image 3 AI image generation
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
An MCP server that gives your AI access to the source code and docs of all public github repos
MCP server for AI dialogue using various LLM models via AceDataCloud
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
- FlicenseBqualityBmaintenanceA Python-based MCP server that adds image analysis capabilities to text-only LLMs via a single analyze_image tool, supporting local files, URLs, auto-scaling, and multiple OpenAI-compatible APIs.1-
- 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
- AlicenseAqualityBmaintenanceMCP server that provides an analyze_image tool using OpenAI-compatible vision LLMs to describe images from file paths, URLs, or base64 data.110 npm1MIT