Skip to main content
Glama

Vision MCP Server

비멀티모달 모델(DeepSeek, 구형 GPT-4, 로컬 소형 모델 등)에 연결된 에이전트에 시각 이해 기능을 제공하는 Model Context Protocol(MCP) 서버입니다. 에이전트가 이미지를 MCP 도구에 넘기면 서버가 비전 모델을 호출하고 텍스트를 반환합니다.

중국과 미국의 주요 제공업체와 모든 OpenAI 호환 엔드포인트를 지원합니다. 공식 SDK 우선, 구현 전 추상화, 침입 없는 제공업체 추가 방식입니다.

中文文档见 README.zh-CN.md

기능

  • 4가지 도구: analyze_image / describe_image / ocr_image / list_providers, 모두 일반 Markdown 텍스트 반환

  • 13개 내장 제공업체: OpenAI / Anthropic / Google Gemini / Qwen (DashScope) / Zhipu / Doubao (Volcengine) / ERNIE (Qianfan) / StepFun / Ollama / Alibaba Bailian / SiliconFlow / OpenRouter / 커스텀 OpenAI 호환 엔드포인트

  • 세 가지 이미지 입력: 로컬 경로 / http(s) URL / base64 (data URI 또는 원시 base64), 자동 감지

  • 3단계 폴백 체인: 공식 SDK → OpenAI 호환 엔드포인트 → 네이티브 fetch (SPEC §1 참조)

  • 무상태(Stateless): 모든 호출은 독립적이며, 이미지와 결과는 절대 캐시되지 않고, 키는 환경 변수에서만 읽습니다.

Related MCP server: vision-mcp

빠른 시작

옵션 A: npx (npm에 배포됨, 저장소 불필요)

npx -y @inferai/vision-mcp

옵션 B: 로컬 빌드

git clone <repo> && cd vision-mcp
pnpm install
pnpm build
node dist/index.js

MCP 구성 예시 (stdio)

서버는 stdio 전송을 사용합니다. MCP 클라이언트가 프로세스를 생성하고 stdin/stdout을 통해 JSON-RPC 메시지를 교환합니다. 클라이언트가 MCP 서버를 정의하는 곳 어디에서나 구성하세요:

  • Claude Code: 프로젝트 수준 .mcp.json 또는 사용자 수준 ~/.claude.json (mcpServers 키)

  • Claude Desktop: claude_desktop_config.json

  • 모든 MCP 클라이언트 (Cursor, 자체 제작 에이전트 등): 동일한 구조

npx 버전 (패키지 게시 후 사용 가능):

{
  "mcpServers": {
    "vision-mcp": {
      "command": "npx",
      "args": ["-y", "@inferai/vision-mcp"],
      "env": {
        "OPENAI_API_KEY": "sk-...",
        "DASHSCOPE_API_KEY": "sk-..."
      }
    }
  }
}

로컬 개발 (경로 조정, --env-file-if-exists=.env는 .env를 네이티브로 로드):

{
  "mcpServers": {
    "vision-mcp": {
      "command": "node",
      "args": ["--env-file-if-exists=.env", "/absolute/path/to/vision-mcp/dist/index.js"],
      "env": {
        "OPENAI_API_KEY": "sk-..."
      }
    }
  }
}

시작 인수 포함 (argv로 제공업체 기본값 재정의, 아래 참조):

{
  "mcpServers": {
    "vision-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@inferai/vision-mcp",
        "--default-provider=dashscope",
        "--siliconflow-api-key=sk-...",
        "--siliconflow-model=Qwen/Qwen2.5-VL-7B-Instruct"
      ],
      "env": {
        "DASHSCOPE_API_KEY": "sk-..."
      }
    }
  }
}

stdio 참고 사항:

  • stdout은 MCP 프로토콜만 전달합니다. 서버는 절대 로그를 출력하지 않으며, 진단 정보는 stderr로 전송됩니다.

  • 클라이언트가 프로세스 수명 주기를 관리합니다(시작 시 생성, 종료 시 종료). 데몬이 필요 없습니다.

  • 첫 npx 실행 시 패키지를 다운로드하므로 몇 초가 걸릴 수 있습니다.

  • 클라이언트가 셸 환경을 상속하는 경우 환경 변수는 셸 환경에서도 가져올 수 있습니다(env 블록 불필요).

MCP Inspector로 디버깅:

pnpm dlx @modelcontextprotocol/inspector node dist/index.js --xxx-api-key=xxx --xxx2-api-key=xxx

변수 설정

  1. MCP 구성 env 블록 (권장, 플랫폼 간 가장 안정적) — 위 env 객체에 변수 작성

  2. .env 파일 (로컬 개발) — .env.example을 .env로 복사하고 작성한 후 node --env-file-if-exists=.env dist/index.js 실행 (Node 22 네이티브, dotenv 불필요)

  3. 셸 export — export OPENAI_API_KEY=sk-xxx 후 실행

키가 없는 제공업체는 list_providers에서 사용 불가로 표시되며, 호출 시 누락된 변수를 보고합니다.

게시 (npx 작동 전)

pnpm publish          # or pnpm release (changeset flow)

환경 변수

모든 제공업체의 API_KEY, BASE_URL, MODEL은 환경 변수로 재정의할 수 있습니다(규칙: <PROVIDER_PREFIX>_API_KEY / <PROVIDER_PREFIX>_BASE_URL / <PROVIDER_PREFIX>_MODEL):

제공업체

환경 변수

기본 모델

OpenAI

OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MODEL

gpt-4o

Anthropic

ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, ANTHROPIC_MODEL

claude-sonnet-4-5

Google Gemini

GEMINI_API_KEY, GEMINI_BASE_URL, GEMINI_MODEL

gemini-2.5-flash

Alibaba DashScope

DASHSCOPE_API_KEY, DASHSCOPE_BASE_URL, DASHSCOPE_MODEL

qwen-vl-max

Zhipu

ZHIPU_API_KEY, ZHIPU_BASE_URL, ZHIPU_MODEL

glm-4v-flash (무료)

Volcengine Doubao

VOLCENGINE_ARK_API_KEY, VOLCENGINE_ARK_BASE_URL, VOLCENGINE_ARK_MODEL

doubao-1.5-vision-pro

Baidu Qianfan

QIANFAN_API_KEY, QIANFAN_SECRET_KEY, QIANFAN_BASE_URL, QIANFAN_MODEL

ernie-4.5-vl-8k

StepFun

STEPFUN_API_KEY, STEPFUN_BASE_URL, STEPFUN_MODEL

step-1v

Ollama (로컬)

OLLAMA_BASE_URL, OLLAMA_MODEL

— (내장 기본값 없음, 엔드포인트와 모델을 설정해야 함)

Alibaba Bailian

BAILIAN_API_KEY, BAILIAN_BASE_URL (기본 DashScope 호환 모드), BAILIAN_MODEL

qwen-vl-max

SiliconFlow

SILICONFLOW_API_KEY, SILICONFLOW_BASE_URL (기본 https://api.siliconflow.cn/v1), SILICONFLOW_MODEL

Qwen/Qwen2.5-VL-72B-Instruct

OpenRouter

OPENROUTER_API_KEY, OPENROUTER_BASE_URL (기본 https://openrouter.ai/api/v1), OPENROUTER_MODEL

openai/gpt-4o

커스텀 호환

OPENAI_COMPAT_BASE_URL, OPENAI_COMPAT_API_KEY?, OPENAI_COMPAT_MODEL

—

? = 선택 사항(내장 기본값 있음); * = 필수.

전역 구성:

환경 변수

기본값

설명

VISION_MCP_DEFAULT_PROVIDER

첫 번째 사용 가능

기본 제공업체

VISION_MCP_DEFAULT_MODEL

제공업체 기본값

기본 모델

VISION_MCP_PROVIDER_PRIORITY

표 순서

제공업체 우선순위 (쉼표로 구분, 높은 순서, 예: openai,dashscope,zhipu)

VISION_MCP_MAX_RETRIES

0 (끔)

폴백 전 제공업체별 재시도 횟수

VISION_MCP_MAX_FALLBACKS

0 (끔)

포기 전 최대 제공업체 폴백 횟수

VISION_MCP_MAX_IMAGE_BYTES

20 MB

이미지 크기 제한

VISION_MCP_TIMEOUT_MS

60000

다운로드 및 요청 시간 초과 (ms)

폴백 체인

여러 제공업체를 사용할 수 있는 경우, 호출은 우선순위 체인을 따라 진행됩니다: 구성된 기본값 → VISION_MCP_PROVIDER_PRIORITY 목록 → 표 순서 (사용 불가 제공업체는 건너뜀).

  • 각 제공업체는 제공업체 오류(업스트림 실패, 시간 초과) 시 VISION_MCP_MAX_RETRIES 횟수만큼 재시도됩니다.

  • 제공업체가 재시도를 모두 소진하면 체인의 다음 사용 가능한 제공업체가 시도되며, 최대 VISION_MCP_MAX_FALLBACKS 폴백까지 허용됩니다.

  • 제공업체 오류만 재시도/폴백을 트리거하며, 구성 또는 이미지 오류는 즉시 실패합니다.

  • 명시적으로 요청된 provider 인수는 단독으로 시도됩니다(폴백 없음).

  • 모든 것이 실패하면, 오류는 시도된 모든 제공업체와 각각의 마지막 오류를 나열합니다.

argv로도 사용 가능: --provider-priority=..., --max-retries=N, --max-fallbacks=N (환경 변수보다 우선).

MCP 시작 인수 (argv)

모든 제공업체의 apiKey / baseUrl / model은 시작 인수로 재정의할 수 있습니다(환경 변수보다 높은 우선순위), 형식 --<provider>-<field>:

node dist/index.js \
  --openai-api-key=sk-xxx \
  --openai-base-url=https://my-gateway.example.com/v1 \
  --openai-model=gpt-4o-mini \
  --dashscope-api-key=sk-xxx \
  --default-provider=dashscope
  • 전역: --default-provider <name> / --default-model <name>

  • 제공업체별: --<provider>-api-key, --<provider>-base-url, --<provider>-model (등호 또는 공백 형식 모두 작동)

  • 모든 OpenAI 호환 타사 서비스: --openai-compat-base-url + --openai-compat-api-key + --openai-compat-model 한 줄로 연결; 또는 내장 제공업체의 base-url을 미러/프록시로 지정

우선순위: 도구 인수 provider/model > 시작 인수 (제공업체별 > 전역 기본값) > 환경 변수 > 제공업체 내장 기본값.

도구

도구

인수

설명

analyze_image

image*, prompt?, provider?, model?

일반 이미지 분석

describe_image

image*, provider?, model?

이미지 내용 설명 (기본 지시문)

ocr_image

image*, language? (auto/zh/en/zh-en), provider?, model?

OCR, 레이아웃 보존

list_providers

—

제공업체 목록 및 구성 상태

image는 다음을 허용합니다: 로컬 경로 / http(s):// URL / data: URI / 원시 base64, 자동 감지.

보안 참고 사항: URL 다운로드는 SSRF로부터 보호됩니다. 모든 홉(리디렉션 포함)이 검증되며, 루프백, 사설 또는 링크-로컬 주소로 확인되는 URL은 차단됩니다(오류에 이유가 힌트로 표시됨).

제공업체 통합 (3단계 폴백 체인)

provider

통합 방식

비고

openai / stepfun / ollama / bailian / siliconflow / openrouter / openai-compat

OpenAI 호환 어댑터 (openai SDK)

단일 어댑터, baseURL 구성 가능

anthropic

공식 SDK @anthropic-ai/sdk

messages + 이미지 콘텐츠 블록

gemini

공식 SDK @google/generative-ai

generateContent + inlineData

dashscope

네이티브 fetch

공식 npm 패키지에 비전 기능 없음; 직접 multimodal-generation API 사용

zhipu

네이티브 fetch

공식 SDK는 문자열 콘텐츠만 허용; 직접 v4 API 사용

volcengine

네이티브 fetch

공식 openapi는 관리 플레인; 직접 Ark API 사용

qianfan

네이티브 fetch

공식 SDK는 문자열 전용; AK/SK → 토큰 → v2 API

프로바이더 추가: OpenAI 호환 엔드포인트의 경우 src/core/config.ts의 RULES에 행 하나와 src/index.ts의 팩토리 테이블에 매핑 하나를 추가하면 됩니다 — 새 코드 없이 가능합니다. 공식 SDK 또는 네이티브 fetch 구현: SPEC §1 참조.

개발

pnpm check        # biome checks
pnpm test         # rstest unit tests (injected mocks, no network)
pnpm build        # rslib build

실제 호출 스모크 테스트(키가 구성된 프로바이더에 대해서만 실행, 그 외에는 건너뜀):

OPENAI_API_KEY=sk-... pnpm exec rstest tests/e2e

아키텍처

src/
├── index.ts            # Entry: composition root, stdio startup
├── core/               # Abstraction: interfaces / image loading / config / registry
├── providers/          # Adapters: official SDK or compatible endpoints, protocol conversion only
└── server/tools.ts     # MCP tool layer: zod validation + error mapping

전체 사양: SPEC.md.

Available Tools

4 tools
analyze_imageA

Analyze one or more images with a vision model and return the text result. Accepts 1 to 9 images (local path, URL, data URI, or base64; types can be mixed). Pass several images to compare, diff, or combine them — the model sees them in the given order. Use for reading screenshots, photos, charts, UI states, document pages, etc.

NameRequiredDescriptionDefault
modelNoModel name, overrides the provider default model
imagesYesOne image, or an array of up to 9 images. Each entry: local path / http(s):// URL / data: URI / raw base64 string; types can be mixed. Pass multiple images to compare, diff, or combine them (e.g. before/after pairs, several charts) — order matters.
promptNoAnalysis instruction; defaults to a detailed description of the image(s)
providerNoProvider name (e.g. openai / dashscope / zhipu / ollama); defaults to the configured default

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does a good job: it mentions the ability to handle 1-9 images, supports multiple formats (local path, URL, data URI, base64), and clarifies that order is preserved and images can be compared/diffed. This goes beyond what one might assume and helps the agent anticipate multi-image behavior. However, it does not mention any potential failure modes, rate limits, or other operational details that could be relevant, though these may not be necessary for this tool.

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 exceptionally concise—two sentences that efficiently convey the core purpose, input capabilities, and typical use cases. It is front-loaded with the primary function and does not contain redundant or explanatory fluff. Every clause adds value, and the structure flows naturally from what it does to how it behaves with multiple inputs.

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?

For a tool with four parameters, no nested objects, and no output schema, the description covers the essential aspects: input types, count limits, ordering, and example use cases. It gives the agent enough to invoke the tool correctly for common scenarios. It does not explain when to prefer this over describe_image or ocr_image, which could be considered a completeness gap given those siblings exist, but the description still stands on its own as a complete usage guide for the tool itself.

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

Parameters3/5

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

The schema description coverage is 100%, and the schema itself already thoroughly explains the parameters, including the images format, the order-preservation nuance, and the default prompt behavior. The tool description adds little beyond what the schema states. For instance, the description's note about 'compare, diff, or combine' is a rephrasing of the schema's 'compare, diff, or combine' text. Since the schema covers this ground, the description meets the baseline but does not add substantial new meaning.

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 clearly states the tool's purpose: 'Analyze one or more images with a vision model and return the text result.' It specifies a verb (analyze) and a resource (images), and indicates the output (text). However, it does not differentiate from the siblings describe_image and ocr_image, which likely serve overlapping purposes. For example, it does not explain how analyze_image is distinct from describe_image beyond the multi-image capability.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool, listing use cases such as 'reading screenshots, photos, charts, UI states, document pages, etc.' This gives an agent a good sense of appropriate scenarios. However, it does not explicitly mention alternatives or exclusions, such as 'use describe_image for single images' or 'use ocr_image for text extraction only,' so the guidance is strong but not exhaustive.

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

describe_imageA

Describe the image content: subject, layout, text, details. Accepts 1 to 9 images; each image is described in the given order. Equivalent to analyze_image with the default description instruction.

NameRequiredDescriptionDefault
modelNoModel name, overrides the provider default model
imagesYesOne image, or an array of up to 9 images. Each entry: local path / http(s):// URL / data: URI / raw base64 string; types can be mixed. Pass multiple images to compare, diff, or combine them (e.g. before/after pairs, several charts) — order matters.
providerNoProvider name (e.g. openai / dashscope / zhipu / ollama); defaults to the configured default

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description provides limited behavioral info. It states that it accepts 1–9 images and preserves order, which is useful, but does not mention side effects, authentication, rate limits, or error handling. Since it's a descriptive read operation, the risk is low, but transparency is incomplete.

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?

Two concise sentences convey the core function, parameter limits, and ordering behavior without fluff. The information is front-loaded and efficiently structured.

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?

There is no output schema, but the description implies text output via 'Describe the image content'. It covers the input constraints and purpose adequately. While it doesn't specify return format, that is not critical for a description task, and the context is sufficiently complete.

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?

Schema coverage is 100%, so baseline is 3. The description adds value by explaining the images parameter: 'Pass multiple images to compare, diff, or combine them (e.g. before/after pairs, several charts) — order matters.' This enriches understanding beyond the schema's generic 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 states a specific verb ('Describe') and resource ('image content') with explicit scope (subject, layout, text, details). It also distinguishes from siblings by noting it is 'Equivalent to analyze_image with the default description instruction', which clarifies its relationship to a similar tool.

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

Usage Guidelines4/5

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

The description implies usage by mentioning equivalence to analyze_image, suggesting that custom instructions would require analyze_image. However, it does not explicitly state when to use this tool over ocr_image or list_providers, leaving some ambiguity. Still, the core use case is clear.

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

list_providersA

List all registered vision model providers, their default models, and configuration status. Providers without keys will error when called.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

There are no annotations, so the description carries full burden. It mentions that providers without keys will error when called, which is a useful behavioral warning. However, it doesn't disclose potential side effects (though listing is read-only, it could be mistaken), nor does it explain implications of configuration status, but the warning is a positive.

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 two sentences, extremely concise, and front-loaded with the core action (list all providers) and output details. Every sentence provides value: the second clarifies error behavior. No redundancy or fluff.

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 output schema, no annotations), the description covers key aspects: what it lists, the error condition. It lacks explicit mention of the exact return format or whether it includes provider IDs, but for a list tool, this is largely sufficient. A minor gap is not specifying if it returns configuration status as structured data or human-readable text.

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, so there are no parameter semantics to explain. The description focuses on the output content (default models, configuration status), which is sufficient. With no parameters, a baseline of 4 is appropriate as the description adds meaning about the result.

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 clearly states the tool lists all registered vision model providers, including their default models and configuration status. It distinguishes itself from sibling tools (analyze/describe/ocr) which are image-related operations, though it doesn't explicitly compare.

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 doesn't explicitly state when to use this tool vs alternatives, but the purpose is clear enough that an agent would know it's for listing providers, not image analysis. It conveys usage context implicitly by listing what it returns, but no explicit exclusions or alternative tool references.

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

ocr_imageA

OCR: transcribe all text in the image(s), preserving reading order and paragraph structure. Accepts 1 to 9 images; transcripts follow the given order. Suitable for screenshots, scans, invoices, slides, etc.

NameRequiredDescriptionDefault
modelNoModel name, overrides the provider default model
imagesYesOne image, or an array of up to 9 images. Each entry: local path / http(s):// URL / data: URI / raw base64 string; types can be mixed. Pass multiple images to compare, diff, or combine them (e.g. before/after pairs, several charts) — order matters.
languageNoRecognition language; defaults to auto
providerNoProvider name (e.g. openai / dashscope / zhipu / ollama); defaults to the configured default

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does disclose meaningful behavior: preserving reading order and paragraph structure, accepting 1–9 images, and returning transcripts in the given order. It does not mention output format or error behavior, but the core read-only transcription behavior is well covered.

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?

Three short sentences with the core action front-loaded. Every sentence earns its place, and there is no redundancy or filler.

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?

The description covers purpose, input limits, ordering, and typical use cases, which is sufficient for an agent to select and invoke the tool. Since there is no output schema, a brief note on return format would improve completeness, but this is a minor gap for a simple OCR tool.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description reinforces image order and count, which the schema already documents, but adds no parameter-level meaning for model, language, or provider beyond what the schema provides.

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 states a specific verb ('transcribe all text') and resource ('image(s)'), and adds output characteristics (reading order, paragraph structure). This clearly distinguishes it from sibling tools like analyze_image and describe_image.

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?

It gives concrete use cases (screenshots, scans, invoices, slides) but does not explicitly state when to choose this tool over analyze_image or describe_image, nor when not to use it. The differentiation is implied by the OCR action rather than stated.

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. 3 tool updatesv1.1.1
    • Changedanalyze_image4 fields changed
      • removedInput schema / properties / image
        Removed value: -{
        -  "description": "Image: local path / http(s):// URL / data: URI / raw base64 string",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • addedInput schema / properties / images
        Added value: +{
        +  "anyOf": [
        +    {
        +      "description": "local path / http(s):// URL / data: URI / raw base64 string",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    {
        +      "description": "Array of 9 images max; order is preserved when the model sees them",
        +      "items": {
        +        "description": "local path / http(s):// URL / data: URI / raw base64 string",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "maxItems": 9,
        +      "minItems": 1,
        +      "type": "array"
        +    }
        +  ],
        +  "description": "One image, or an array of up to 9 images. Each entry: local path / http(s):// URL / data: URI / raw base64 string; types can be mixed. Pass multiple images to compare, diff, or combine them (e.g. before/after pairs, several charts) — order matters."
        +}
      • changedInput schema / properties / prompt / description
        Previous value: -"Analysis instruction; defaults to a detailed description"New value: +"Analysis instruction; defaults to a detailed description of the image(s)"
      • changedInput schema / required
        Previous value: -[
        -  "image"
        -]New value: +[
        +  "images"
        +]
    • Changeddescribe_image3 fields changed
      • removedInput schema / properties / image
        Removed value: -{
        -  "description": "Image: local path / http(s):// URL / data: URI / raw base64 string",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • addedInput schema / properties / images
        Added value: +{
        +  "anyOf": [
        +    {
        +      "description": "local path / http(s):// URL / data: URI / raw base64 string",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    {
        +      "description": "Array of 9 images max; order is preserved when the model sees them",
        +      "items": {
        +        "description": "local path / http(s):// URL / data: URI / raw base64 string",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "maxItems": 9,
        +      "minItems": 1,
        +      "type": "array"
        +    }
        +  ],
        +  "description": "One image, or an array of up to 9 images. Each entry: local path / http(s):// URL / data: URI / raw base64 string; types can be mixed. Pass multiple images to compare, diff, or combine them (e.g. before/after pairs, several charts) — order matters."
        +}
      • changedInput schema / required
        Previous value: -[
        -  "image"
        -]New value: +[
        +  "images"
        +]
    • Changedocr_image3 fields changed
      • removedInput schema / properties / image
        Removed value: -{
        -  "description": "Image: local path / http(s):// URL / data: URI / raw base64 string",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • addedInput schema / properties / images
        Added value: +{
        +  "anyOf": [
        +    {
        +      "description": "local path / http(s):// URL / data: URI / raw base64 string",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    {
        +      "description": "Array of 9 images max; order is preserved when the model sees them",
        +      "items": {
        +        "description": "local path / http(s):// URL / data: URI / raw base64 string",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "maxItems": 9,
        +      "minItems": 1,
        +      "type": "array"
        +    }
        +  ],
        +  "description": "One image, or an array of up to 9 images. Each entry: local path / http(s):// URL / data: URI / raw base64 string; types can be mixed. Pass multiple images to compare, diff, or combine them (e.g. before/after pairs, several charts) — order matters."
        +}
      • changedInput schema / required
        Previous value: -[
        -  "image"
        -]New value: +[
        +  "images"
        +]
  2. 4 tool updatesv1.0.0
    • First observedanalyze_image
    • First observeddescribe_image
    • First observedlist_providers
    • First observedocr_image

TDQS

A3.7/5.0

Scored across 4 tools

Disambiguation2/5

analyze_image, describe_image, and ocr_image all accept the same input and return text results. describe_image is explicitly described as equivalent to analyze_image with a default instruction, and ocr_image is just a specialized prompt variant. This creates significant overlap and makes it unclear when to choose one over another. Only list_providers is clearly distinct.

Naming Consistency4/5

All tool names use snake_case with a verb-first pattern: analyze_image, list_providers, describe_image, ocr_image. The only minor deviation is ocr_image using an acronym instead of a plain verb, but it still fits the pattern. Overall, naming is predictable and consistent.

Tool Count3/5

With only 4 tools, the server is on the low end of the typical range. However, 3 of the 4 tools essentially perform the same task with different prompt variations, so the effective functionality is even more limited. The count feels padded rather than well-scoped, and could be reduced to just analyze_image and list_providers without loss.

Completeness4/5

The server covers the core functionality of image analysis, including general analysis, description, and OCR, plus provider list management. Since analyze_image is generic and accepts multiple images for comparison, it covers most basic vision tasks. Minor gaps include lack of explicit model management or configuration tools, but list_providers partially addresses this.

Maintenance

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for analyzing images using multiple vision LLM providers (OpenCode, OpenAI, Anthropic, Google, and custom OpenAI-compatible endpoints). Provides tools to analyze single or multiple images, list providers, and test vision capabilities.
    MIT