vision-mcp
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互換エンドポイント
3種類の画像入力: ローカルパス / http(s) URL / base64(data URIまたは生のbase64)。自動判別されます
3段階のフォールバックチェーン: 公式SDK → OpenAI互換エンドポイント → ネイティブfetch(SPEC §1参照)
ステートレス: すべての呼び出しは独立しています。画像と結果は決してキャッシュされず、キーは環境変数からのみ読み取られます
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.jsMCP設定例(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変数の設定
MCP設定の
envブロック(推奨。プラットフォーム間で最も信頼性が高い)— 上記のenvオブジェクトに変数を記述します.envファイル(ローカル開発)—.env.exampleを.envにコピーして記入し、node --env-file-if-exists=.env dist/index.jsを実行します(Node 22ネイティブ、dotenv不要)シェルの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 |
|
|
Anthropic |
|
|
Google Gemini |
|
|
Alibaba DashScope |
|
|
Zhipu |
|
|
Volcengine Doubao |
|
|
Baidu Qianfan |
|
|
StepFun |
|
|
Ollama(ローカル) |
| —(組み込みデフォルトなし。エンドポイントとモデルの設定必須) |
Alibaba Bailian |
|
|
SiliconFlow |
|
|
OpenRouter |
|
|
カスタム互換 |
| — |
?= 任意(組み込みデフォルトあり);*= 必須。
グローバル設定:
環境変数 | デフォルト | 説明 |
| 最初に利用可能なもの | デフォルトプロバイダー |
| プロバイダーデフォルト | デフォルトモデル |
| 表の順序 | プロバイダー優先順位(カンマ区切り、高い順。例: |
| 0(オフ) | フォールバック前のプロバイダーごとのリトライ回数 |
| 0(オフ) | 断念するまでの最大プロバイダーフォールバック数 |
| 20 MB | 画像サイズ制限 |
| 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で1行で接続可能。または、任意の組み込みプロバイダーのbase-urlをミラー/プロキシに向けることも可能
優先順位: ツール引数のprovider/model > 起動引数(プロバイダーごと > グローバルデフォルト) > 環境変数 > プロバイダーの組み込みデフォルト。
ツール
ツール | 引数 | 説明 |
|
| 一般的な画像分析 |
|
| 画像内容の説明(デフォルトの指示文) |
|
| OCR。レイアウトを保持 |
| — | プロバイダー一覧と設定状態 |
imageは以下を受け付けます:ローカルパス / http(s):// URL / data: URI / 生のbase64。自動判別されます。
セキュリティ上の注意: URLダウンロードはSSRF保護されています。すべてのホップ(リダイレクトを含む)が検証され、ループバック、プライベート、リンクローカルアドレスに解決されるURLはブロックされます(エラーにその理由のヒントが含まれます)。
プロバイダー統合(3段階フォールバックチェーン)
プロバイダー | 統合 | 備考 |
| OpenAI 互換アダプタ(openai SDK) | 1 つのアダプタで baseURL を設定可能 |
| 公式 SDK @anthropic-ai/sdk | messages + image content block |
| 公式 SDK @google/generative-ai | generateContent + inlineData |
| ネイティブ fetch | 公式 npm パッケージは vision 非対応。multimodal-generation API を直接使用 |
| ネイティブ fetch | 公式 SDK は文字列コンテンツのみ受け付け。v4 API を直接使用 |
| ネイティブ fetch | 公式 openapi は管理プレーン。Ark API を直接使用 |
| ネイティブ fetch | 公式 SDK は文字列のみ対応。AK/SK → token → v2 API を使用 |
プロバイダーの追加: OpenAI 互換エンドポイントの場合、src/core/config.ts の RULES に 1 行追加し、src/index.ts のファクトリテーブルに 1 つのマッピングを追加するだけで、新しいコードは不要です。公式 SDK またはネイティブ fetch の実装は SPEC §1 を参照してください。
開発
pnpm check # biome checks
pnpm test # rstest unit tests (injected mocks, no network)
pnpm build # rslib build実呼び出しスモークテスト(API キーが設定されているプロバイダーに対してのみ実行され、それ以外ではスキップされます):
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 toolsanalyze_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.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Model name, overrides the provider default model | |
| images | Yes | 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. | |
| prompt | No | Analysis instruction; defaults to a detailed description of the image(s) | |
| provider | No | Provider name (e.g. openai / dashscope / zhipu / ollama); defaults to the configured default |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Model name, overrides the provider default model | |
| images | Yes | 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. | |
| provider | No | Provider name (e.g. openai / dashscope / zhipu / ollama); defaults to the configured default |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Model name, overrides the provider default model | |
| images | Yes | 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. | |
| language | No | Recognition language; defaults to auto | |
| provider | No | Provider name (e.g. openai / dashscope / zhipu / ollama); defaults to the configured default |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v1.1.1- Changed
analyze_image4 fields changed- removed
Input schema / properties / imageRemoved value: -{ - "description": "Image: local path / http(s):// URL / data: URI / raw base64 string", - "minLength": 1, - "type": "string" -} - added
Input schema / properties / imagesAdded 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." +} - changed
Input schema / properties / prompt / descriptionPrevious value: -"Analysis instruction; defaults to a detailed description"New value: +"Analysis instruction; defaults to a detailed description of the image(s)" - changed
Input schema / requiredPrevious value: -[ - "image" -]New value: +[ + "images" +]
- Changed
describe_image3 fields changed- removed
Input schema / properties / imageRemoved value: -{ - "description": "Image: local path / http(s):// URL / data: URI / raw base64 string", - "minLength": 1, - "type": "string" -} - added
Input schema / properties / imagesAdded 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." +} - changed
Input schema / requiredPrevious value: -[ - "image" -]New value: +[ + "images" +]
- Changed
ocr_image3 fields changed- removed
Input schema / properties / imageRemoved value: -{ - "description": "Image: local path / http(s):// URL / data: URI / raw base64 string", - "minLength": 1, - "type": "string" -} - added
Input schema / properties / imagesAdded 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." +} - changed
Input schema / requiredPrevious value: -[ - "image" -]New value: +[ + "images" +]
4 tool updates
v1.0.0- First observed
analyze_image - First observed
describe_image - First observed
list_providers - First observed
ocr_image
TDQS
Scored across 4 tools
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.
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.
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.
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
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
MCP server exposing the YourImageShare upload API (upload/list/delete) as tools for AI agents.
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA versatile MCP server that adds vision capabilities (image analysis, OCR, image/video generation) to AI models lacking native vision, with support for multiple providers and automatic task routing.-
- AlicenseAqualityDmaintenanceMCP server that provides an analyze_image tool using OpenAI-compatible vision LLMs to describe images from file paths, URLs, or base64 data.15 npm1MIT
- FlicenseAqualityCmaintenanceOpenAI-compatible vision MCP server with 14 provider presets that enables MCP clients to analyze images, including screenshots, text, and UI mockups, via a single analyze_image tool.2-
- AlicenseNot gradedqualityDmaintenanceMCP 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