Skip to main content
Glama

visionMCP 👁️

The eyes of a bigger reasoning LLM.

visionMCP is a Model Context Protocol server that gives any MCP-capable agent real vision. A text-only reasoning model can delegate anything it cannot see to this server: describe a screenshot, answer a question about a photo, OCR a document, or compare two images — the server does the seeing and hands back text.

It works with all three major vision backends, chosen at runtime from a single config.json:

Provider

API

Example models

Ollama

OpenAI-compatible (http://localhost:11434/v1)

llama3.2-vision, qwen2.5vl, llava

OpenAI

Chat Completions vision API

gpt-4o, gpt-4o-mini

Anthropic

Claude Messages vision API

claude-3-5-sonnet-latest, claude-3-7-sonnet-latest


Features

  • 🔍 Four vision tools for a reasoning LLM to call:

    • describe_image — full natural-language description

    • ask_about_image — targeted Q&A about any image

    • extract_text — OCR / transcription

    • compare_images — side-by-side comparison

  • 🖼️ Every source accepted: local file paths, http(s) URLs, and base64 data: URIs.

  • 📦 Zero image prep: oversized images are auto-downscaled and re-encoded as JPEG to fit provider payload limits.

  • 🔌 Three transports: stdio (default, for local MCP clients), http (Streamable HTTP for remote hosting), or sse (legacy Server-Sent Events).

  • ⚙️ One config.json controls provider, API key, API URL, and model. Environment variables and CLI flags can override anything.

  • 🚀 uv-managed, installable, runnable, and hostable.


Related MCP server: depu-img-mcp

Quick start

1. Install

Requires uv and Python ≥ 3.10.

cd visionMCP
uv sync

2. Configure

The shipped config.json already works with a local Ollama. Switch providers by editing the file:

// config.json
{
  "provider": "openai",                  // "ollama" | "openai" | "anthropic"
  "api_key": "sk-...",                   // or leave "" and export OPENAI_API_KEY
  "api_url": "",                         // "" = provider default
  "model": ""                            // "" = provider default
}

See docs/configuration.md for every option, and docs/providers.md for per-provider setup.

Security: keep real API keys out of git — copy config.json to config.local.json (auto-ignored) or use environment variables. The server never logs your key.

3. Run

uv run vision-mcp                        # stdio transport (default)
uv run vision-mcp --transport http --host 0.0.0.0 --port 8100   # host remotely
uv run vision-mcp --show-config          # print resolved config (key masked)

Wiring into an MCP client

opencode (opencode.json)

{
  "mcpServers": {
    "visionMCP": {
      "type": "stdio",
      "command": "uv",
      "args": ["run", "--directory", "/absolute/path/to/visionMCP", "vision-mcp"]
    }
  }
}

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "visionMCP": {
      "command": "uv",
      "args": ["run", "--directory", "/absolute/path/to/visionMCP", "vision-mcp"]
    }
  }
}

Generic MCP client (stdio)

{
  "mcpServers": {
    "visionMCP": {
      "command": "/path/to/visionMCP/.venv/bin/vision-mcp",
      "args": ["--config", "/path/to/visionMCP/config.json"]
    }
  }
}

The server never sends image content to the vision API beyond what the tool call provides. Image bytes are kept in memory and never written to disk.


Tools reference

Tool

Arguments

Returns

describe_image

image (path/URL/data-URI)

Full description in plain text

ask_about_image

image, question

Focused answer

extract_text

image

Transcribed / OCR'd text

compare_images

image_a, image_b, optional question

Comparison in plain text

server_status

Provider, model, transport

An image argument accepts any of:

/path/to/photo.png          # local file
https://example.com/x.jpg   # URL (downloaded at call time)
data:image/png;base64,iVBORw0KGgo...   # base64 data URI

How it works

Everything funnels through one function in src/vision_mcp/pipeline.py:

image (path / URL / data URI)  →  base64 + mime  →  vision model  →  text
        _read()                     _encode()         API[provider]    look()

The server tools are thin wrappers: pipeline.look(cfg, [image], prompt).


Documentation

Development

uv sync --group dev
uv run ruff check .
uv run pytest

License

MIT

Available Tools

5 tools
ask_about_imageC

Answer a specific question about an image.

ParametersJSON Schema
NameRequiredDescriptionDefault
imageYes
questionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral transparency. 'Answer a specific question about an image' explains the broad behavior but does not disclose limitations, input format expectations, failure behavior, or whether the tool relies on an external model. This is minimally transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short, front-loaded sentence with no filler or redundancy. It is concise, but it sacrifices useful context and operational detail for brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has only two simple parameters and an output schema, so the low complexity suggests a short description could be enough. However, the absence of annotations, absence of parameter semantics, and lack of sibling differentiation leave important context too vague for an agent to confidently choose and invoke the tool in varied situations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 meaningfully clarify the 'image' or 'question' parameters. The names are self-explanatory, but there is no guidance on what format 'image' should take or how 'question' should be phrased. The description does not compensate for the absence of parameter-level documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Answer a specific question about an image' clearly states the tool's core purpose with a specific verb and resource. It does not explicitly distinguish itself from siblings like describe_image or compare_images, though the word 'specific question' implies a Q&A interaction rather than open description or extraction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool should be used when the user has a particular question about an image, but it never explicitly states when to use it instead of describe_image, extract_text, or compare_images. There is no explicit exclusion or alternative guidance, so usage context is only weakly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_imagesB

Compare two images. Optional question narrows the comparison.

ParametersJSON Schema
NameRequiredDescriptionDefault
image_aYes
image_bYes
questionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description bears full responsibility for behavioral disclosure. It does not state whether the operation is read-only, what format the comparison output takes, or any side effects. This is a notable gap for a tool that likely performs analysis.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences, no filler. Every phrase adds value, with the optional 'question' parameter highlighted effectively. It is highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (which may cover return values), the description remains incomplete for a 3-parameter tool with no annotations. It lacks usage context, parameter formatting, and any behavioral caveats. Given the simplicity, more detail is expected.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, meaning the description must clarify all parameters. It explains that 'question' narrows the comparison, but gives no semantics for 'image_a' and 'image_b' (e.g., path, URL, data format). This fails to compensate for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Compare' with a clear resource 'two images', and implies a comparison task distinct from siblings like describe_image or extract_text. It effectively differentiates the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives such as describe_image or ask_about_image. The only usage hint is that the optional 'question' narrows the comparison, but this does not address selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_imageA

Describe an image. image is a file path, URL, or data URI.

ParametersJSON Schema
NameRequiredDescriptionDefault
imageYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, and the description does not disclose behavioral aspects such as side effects, network usage, or output format. It only states the action without detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is highly concise, consisting of a single sentence that directly states the purpose and parameter format, with no superfluous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description lacks information about the output or return value, and does not mention any constraints or error conditions, making it incomplete for a full understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explicitly explains that the 'image' parameter can be a file path, URL, or data URI, which adds meaningful context beyond the bare schema definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to describe an image. It distinguishes from siblings like 'ask_about_image' which likely involves questioning about an image, while this is a straightforward description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide any guidance on when to use this tool versus alternatives. It lacks explicit when-to-use or when-not-to-use instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extract_textB

Read all text in an image (OCR).

ParametersJSON Schema
NameRequiredDescriptionDefault
imageYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description alone must disclose behavior. It only states the core action without addressing input format (URL, base64, path), output structure, error handling, or whether the operation is strictly read-only. This is insufficient for an agent to fully anticipate behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that efficiently conveys the tool's purpose. No wasted words or redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although the tool has an output schema (not shown) and only one parameter, the description is incomplete: it does not specify how the image should be provided, what the output precisely is (e.g., raw text, JSON list), or any limitations. The lack of parameter clarification makes the tool under-specified for reliable invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one parameter 'image' of type string with no description and 0% schema description coverage. The description fails to explain what the image parameter expects (e.g., URL, base64, local path) or any constraints. This leaves the parameter meaning completely ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Read all text in an image (OCR)' with a specific verb (read) and resource (image), and the OCR clarification distinguishes it from siblings like describe_image or ask_about_image. It is unambiguous and sets the tool apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for OCR extraction but provides no explicit guidance on when to choose it over alternatives such as describe_image or ask_about_image. No exclusions or comparison are mentioned, so it only implicitly differentiates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

server_statusA

Show the active provider, model, and transport.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the full burden of behavioral transparency. It implies read-only behavior via 'Show', but does not explicitly state that no modifications occur or mention any side effects or permissions. For a simple status tool, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The entire description is a single, focused sentence that is front-loaded with the key verb and object. There is no redundancy or filler; every word contributes to understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, no nested objects) and the existence of an output schema, the description is sufficiently complete. It tells the agent what to expect (active provider, model, transport) and does not need to elaborate further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the baseline for such cases is 4. The schema already confirms no parameters, and the description does not attempt to add any semantics, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Show') and names the resource ('active provider, model, and transport'), making its purpose immediately clear. It also distinctively separates it from the sibling image tools, which have no overlap in function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given on when to use this tool versus alternatives, though the context of sibling tools makes it obvious that it's for status/inspection. There is no mention of prerequisites or typical use cases, so it meets the minimum viability but lacks explicit direction.

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. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedask_about_image
    • First observedcompare_images
    • First observeddescribe_image
    • First observedextract_text
    • First observedserver_status

TDQS

A3.5/5.0
Disambiguation5/5

Each tool targets a clearly distinct task: general description, specific Q&A, OCR, image comparison, and server status. An agent can easily select the right one based on the user's intent, with no meaningful overlap in scope.

Naming Consistency4/5

Four tools follow a verb_noun pattern (describe_image, ask_about_image, extract_text, compare_images) in snake_case. However, server_status deviates as a noun_noun, and compare_images uses plural while others are singular, slightly breaking the pattern.

Tool Count5/5

With only 5 tools, the server is well-scoped and each tool serves a necessary function. This is within the ideal range of 3-15 for a focused vision understanding server.

Completeness4/5

Core vision understanding workflows are covered: describing, asking questions, OCR, comparison, and status checks. Minor missing features like explicit object detection or metadata retrieval are easily approximated via ask_about_image, so no critical dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

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/ThisUserIsRandom/visionMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server