vision-mcp
Sends a single user-specified image and a short prompt to the OpenAI Responses API (e.g. gpt-4.1-mini) for vision analysis, returning concise observation text back to the calling agent. Handles image validation, resizing based on detail level (low/high/auto), metadata stripping, and builds a base64 data URL before sending, so images never need to be publicly hosted.
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., "@vision-mcpanalyze image screenshots/error-2026-10-07.png and tell me what error is shown"
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.
vision-mcp
Strataの「外付けの目」。NASの画像専用フォルダーから、ユーザーが指定した1画像と短い依頼だけをOpenAI公式Responses APIへ送り、観察結果をテキストで返します。最終推論・判断はStrataで続けます。
Windows: スクリーンショット → NASの画像専用SMB共有へ保存
Strata: ファイル名と依頼 → HTTP MCP /mcp → vision-mcp (NAS Docker)
↓ 検証・縮小・メタデータ除去
OpenAI Responses API
↓ 簡潔な観察テキスト
Strata: 観察結果を使って最終回答MCPツールは analyze_image だけです。既存の websearch-mcp は別サーバーのまま使います。
調査結果と採用方式
調査日: 2026-10-07。Strataは環境の特徴に一致する Niko1221/Strata を対象に確認しました。導入済みの版・フォークとの一致は未確認です。
Strataから画像そのものを渡せるか: MCPの
tools/callはJSON引数なので、ツールが定義すればbase64文字列も転送できます。ただしStrata Web UIの添付画像が自動的にツール引数へ入る仕組みは、確認した実装にはありません。serve/web/app.jsはhealth.imagesがfalseのとき画像追加を拒否し、画像貼り付けも処理しません。serve/mcp.pyは辞書のargumentsをそのまま転送し、画像のツール応答はモデルに表示しません。返り値はテキストにします。Windows AMDでも実現できるか: 画像の代わりに相対ファイル名をテキストで渡せば、ローカルVision機能を使わずに実現できます。NASが画像を読み、OpenAIが解析します。AMD/GPU関連のライブラリはコンテナに不要です。
最適な入力方式: 初版はNAS専用共有内の相対ファイル名です。
C:\Users\...はNASからアクセスできません。Windowsから共有へ保存し、共有内の名前だけを指定します。MCPImageContentは主にコンテンツブロックであり、ツール引数への自動添付転送を保証しません。Responses API入力:
input内にinput_textとinput_imageを置き、後者のimage_urlへbase64 data URLを指定します。公式には公開URL・data URL・Files APIのfile IDが使えます。この実装はサーバー側でdata URLを作るため、画像公開やFiles APIへの別アップロードは不要です。費用: 非推論モデル
gpt-4.1-mini、1画像・1リクエスト、出力上限800 tokens、SDK再試行0回、画像縮小、永続的な呼び出し回数制限を採用します。会話履歴は送りません。Docker構成: Python MCP SDKのStreamable HTTP、コンテナ内
0.0.0.0:8000固定、/mcp。ホスト側の公開ポートは変更できます。画像共有は読み取り専用、使用量だけ別volumeへ保存します。Host検証とBearer認証を有効にし、公開先は初期状態でループバックに限定します。
確認したStrata commit: 82f46a8c8f475f001ad76d92f58f4a4f8ffb0253。
参照:
入力方式の比較
方法 | 判断 |
NAS専用共有の相対ファイル名 | 採用。短いJSON引数で済み、NASで読み取り範囲を制限できる |
Windowsのローカル絶対パス | NAS上のコンテナからは直接読めない |
公開画像URL | APIは対応するが、初版では画像の外部公開を必要としない構成にする |
LAN内画像URL | OpenAIから到達できない。NASでの取得処理・SSRF対策が別途必要 |
base64をMCP引数に含める | プログラムからなら可能。Strataのコンテキストとログを画像データで膨らませるため初版では非対応 |
ImageContent | 添付→ツール引数の橋渡しにはクライアント側実装が必要。初版では非対応 |
アップロードHTTP endpoint | SMBが使えない場合の将来案。認証・保存期限・容量管理が必要 |
クリップボード | 付属PowerShellで専用共有へPNG保存し、その名前をStrataへ渡す |
Related MCP server: vision-mcp
NASでの起動
NAS上でこのリポジトリを配置します。以下のコマンドはNASのSSHシェル、リポジトリのディレクトリで実行します。UGREENのDockerプロジェクト機能でも同じComposeと
.envを指定できます。画像専用の共有フォルダーを作成します。例: NAS実パス
/volume1/vision-images、Windows共有名\\192.168.1.20\vision-images。実際のNASパス・IPへ置き換えてください。Macから見える/Volumes/...やWindowsパスをNASのbind mount元に指定しません。.envを設定します。初期ファイルは空のキーで用意済みです。新規cloneではcp .env.example .envで作成します。既存の.envを上書きしないでください。
OPENAI_API_KEY=自分のOpenAI_APIキー
OPENAI_MODEL=gpt-4.1-mini
VISION_MCP_TOKEN=別途生成した32文字以上のランダム文字列
MCP_BIND_IP=192.168.1.20
SERVER_IP=192.168.1.20
MCP_PORT=8001
MCP_ALLOWED_HOSTS=localhost:*,127.0.0.1:*
VISION_IMAGE_DIR=/volume1/vision-images
VISION_MAX_OUTPUT_TOKENS=800
VISION_MAX_CALLS_PER_DAY=20
VISION_MAX_CALLS_PER_10_MIN=3MCP_BIND_IPはNASホストの公開先インターフェース、SERVER_IPはHost検証に追加するNASのIPです。両方設定してください。Composeで使う.envのMCP_PORTはホスト側の公開ポートだけに反映し、コンテナ内は8000番固定です。上の設定例ではNAS-IP:8001からコンテナの8000番へ転送します。MCP_PORT未指定時のホスト側ポートは8102です。NAS名で接続する場合はMCP_ALLOWED_HOSTSへnas-name:8001等、ホスト側のポートを含めて追加します。allowed hostsは接続元IP制限ではありません。
認証トークンの生成例(Pythonのある端末で実行):
python -c 'import secrets; print(secrets.token_urlsafe(32))'OpenAIキーはNASだけに置き、Strataには別のVISION_MCP_TOKENを設定します。NASの共有ACLでWindows利用者に書き込み、コンテナUID/GID 10001:10001に読み取りとディレクトリ走査を許可します。NASの全データ領域をマウントせず、専用フォルダーだけを使用してください。
共有フォルダーの所有グループに読み取り・ディレクトリ走査が許可されている場合は、.envのVISION_IMAGE_GIDにその数値GIDを設定する方法も使えます。例えばフォルダーと画像がgid=10 mode=770ならVISION_IMAGE_GID=10です。Composeのgroup_addで補助グループを追加し、コンテナの実行UIDは10001、画像マウントは読み取り専用を維持します。GIDはNASごとに確認し、今後保存する画像にもそのグループの読み取り権限を付けてください。変更後はdocker compose up -d --force-recreateでコンテナを再作成します。
docker compose up -d --build
docker compose ps
docker compose logs --tail=30 vision-mcp.envにキー・認証トークンが空のままだと起動しません。可能なら.envの権限をchmod 600 .envにします。.envは自動でPythonに読み込まれず、Composeが環境変数に展開します。
既定値のMCP_BIND_IP=127.0.0.1ではWindowsから接続できません。LAN利用時だけNASのLAN IPへ変更します。NASのファイアウォールでも必要なLAN端末に限定し、ルーターのポート転送は設定しません。HTTPは暗号化されないため、信頼できないネットワークを通す場合はTLSのリバースプロキシやVPNを使用してください。
Strataへの登録
既存設定のmcp_serversへvision-mcpを追加してStrataを再起動します。websearch-mcpの既存エントリはそのまま残します。
{
"mcp_servers": {
"vision-mcp": {
"url": "http://192.168.1.20:8001/mcp",
"headers": {
"Authorization": "Bearer .envのVISION_MCP_TOKENと同じ値"
}
}
}
}設定断片なので、既存のモデル設定JSON全体を置き換えないでください。StrataはmcpServers形式にも対応します。チャットの「Use tools from MCP servers」を有効にします。Strata内部ではサーバー名の正規化・接頭辞が付く場合がありますが、MCP上のツール名はanalyze_imageです。
画像解析
Windowsで画像を \\192.168.1.20\vision-images\error.png に保存し、Strataに次のように依頼します。
vision-mcpのanalyze_imageで、image="error.png"、detail="high"、prompt="エラーダイアログの本文とコードを読み取って" を実行し、その結果から対処方法を考えて。
analyze_image(
image="error.png", # または screenshots/error.png
prompt="エラー本文・コード・ボタン名を読み取ってください。",
detail="high"
) -> str画像はPNG/JPEG/WebP/静止GIF、10 MiB以下・2000万画素以下です。アニメーション、シンボリックリンク、隠しパス、絶対パス、..、URL、base64は受け付けません。ファイルは呼び出し時点で読み取り、削除しません。差し替えを避けたい画像は一意な名前で保存してください。
クリップボードから
WindowsでWin+Shift+Sを押して画像をコピーし、リポジトリ内のスクリプトを実行します。
powershell.exe -STA -File .\scripts\Save-VisionClipboard.ps1 -Share '\\192.168.1.20\vision-images'PNGを共有へ保存し、Strataに渡すファイル名を表示します。スクリプトはOpenAIへ送信せず、クリップボードも変更しません。実際のAPI送信はその後のanalyze_image呼び出しで行います。Windows PowerShell 5.1用で、組織のスクリプト実行ポリシーに従ってください。
コストと出力
設定 | 既定値・動作 |
|
|
| 800。設定範囲128〜2000。大量OCRは途中で切れる場合がある |
| 既定。送信前に長辺2048px以下に縮小。文字/UI向け |
| 送信前に長辺512px以下に縮小。写真の概要向け。小さい文字には不向き |
| 長辺2048px以下に縮小後、APIへautoとして送信 |
| 初版では非対応。既定モデルも非対応。原寸送信を意味するhighへの読み替えはしない |
APIタイムアウト | HTTP timeout 45秒、呼び出し全体50秒。Strata既定60秒以内を目安 |
再試行 | SDKでは0回。1回1画像。同時実行は1件、混雑時は拒否 |
| 3回。直近600秒 |
| 20回。UTC 00:00(日本時間09:00)に日次集計が切り替わる |
失敗・タイムアウト・キャンセル時も予約した呼び出し回数を残します。画像検証で失敗した場合は予約前なので消費しません。回数はSQLiteに原子的に記録し、コンテナ再起動でも残ります。使用量DBにアクセスできない場合はAPIを呼びません。volumeを削除すると履歴も消えるため、通常運用ではdocker compose down -vを使わないでください。
gpt-4.1-miniの通常料金は入力$0.40/100万tokens、出力$1.60/100万tokens(調査時点)。出力800 tokensなら出力部分は最大$0.00128で、画像・依頼・指示の入力料金が別途加算されます。料金・モデル仕様は変更されるため公式ページを確認してください。呼び出し回数の上限は金額ベースの予算保証ではありません。
公式の現行画像仕様では、gpt-4.1-miniのlow/high/autoは同じ画像サイズ制約です。detail=lowだけで必ず安くなるとは扱わず、初版では実際の画像を512pxに縮小します。 高解像度のコード・細かいグラフは必要部分を切り出して渡すと、読み取り品質と費用を両立しやすくなります。highでも2048pxを超える画像は縮小されます。
モデルを変更しても推論パラメーターは自動設定しません。既定の非推論モデルを前提に簡潔な観察に限定しています。推論モデルへ変更した場合、推論tokensが出力予算を使い、本文なしで上限に達することがあります。必要ならモデル別設定を拡張してください。
出力は見える事実を中心に、通常12項目以内を指示します。画像内の命令はデータとして扱い、読めない部分は不明とします。指示による抑制であり、誤読や推論の混入を完全に防ぐ保証はありません。出力途中の場合はその旨を返し、自動で再解析しません。
データと秘密情報
OpenAIへ送るのは指定画像の再エンコード結果、prompt、固定指示です。画像名・NASパス・Strataの会話履歴は送りません。ただし画像やprompt内の個人情報は外部へ送信されます。専用共有へ置く前に必要部分だけ切り出し、秘密情報を隠してください。解析結果はStrataの会話に残る可能性があります。
Responses APIにはstore=falseを指定します。これはレスポンス保存を無効化する指定であり、API全体の保持をゼロにする保証ではありません。OpenAIデータ管理を参照してください。
APIキー・
.env・実画像・使用量DBはGitに含めません。Docker build contextにも含めません。SDKエラー本文は外へ返さず、秘密・入力本文・画像・パスをログに出しません。成功時の入力/出力token数だけを記録します。
OPENAI_BASE_URLやプロキシ環境変数を使わず、公式https://api.openai.com/v1に接続します。HTTP MCPは専用Bearer tokenを必須にします。誰でもキーなしでAPIを使える状態にはしません。allowed hostsはDNS rebinding対策であり、認証やファイアウォールの代わりではありません。
コンテナは非root、ルートFS読み取り専用、追加capabilityなし。入力フォルダー内の通常ファイルだけを読み、シンボリックリンクを各階層で拒否します。
確認・開発
Python 3.12以上、Linux/macOS向けです。NASでDocker実行することを想定し、Windowsネイティブでサーバーを起動する構成は対象外です。
python -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python -m unittest discover -s tests -v接続確認は環境変数VISION_MCP_TOKENを設定したシェルで:
.venv/bin/python check_mcp.py http://192.168.1.20:8001/mcpこの確認はinitializeとtools/listだけで、OpenAIを呼びません。実画像で1回だけ動作確認する場合(外部送信・課金あり):
.venv/bin/python check_mcp.py http://192.168.1.20:8001/mcp --image error.png --detail highローカル開発でHTTPを起動する場合、.envの値をシェル環境に設定し、VISION_IMAGE_ROOTとVISION_USAGE_DBは存在するローカル保存先へ設定してからpython server.py --httpを実行します。--httpなしはstdioです。Composeが使うVISION_IMAGE_DIRはbind mount元、Pythonが使うVISION_IMAGE_ROOTはコンテナ内の参照先という違いがあります。
公開Strataクライアントとの任意の互換性テスト:
STRATA_SOURCE=/path/to/Strata .venv/bin/python -m unittest discover -s tests -vこのテストはローカルTCP待ち受けを使い、Strataのserve/mcp.pyからinitialize・tools/list・tools/callを実行します。OpenAI通信は実SDK + MockTransportに置き換えます。STRATA_SOURCEなしではこの1件はskipします。
検証状況
画像の形式・サイズ・パス・シンボリックリンク制限、APIのリクエスト形状、再試行なし、エラーの秘密情報除去、途中出力、SQLite同時予約、HTTP認証・Host/Origin・本文サイズ制限をテスト。
上記commitのStrata HTTPクライアントで実通信互換性を検証。
2026-10-07、利用者のUGREEN NASでDockerビルド・起動、Macからの認証付きMCP接続、共有画像の読み取り、OpenAI APIによる実画像解析の成功を確認。
Windows AMD環境のStrata Web UIから
analyze_imageを呼び出し、解析テキストを利用した回答まで利用者が動作確認済み。クリップボード保存用PowerShellスクリプトのWindows実機実行は未検証。
フォルダー構成と役割
外側の vision-mcp(ハイフン) は、Docker設定なども含むプロジェクト全体のフォルダーです。内側の vision_mcp(アンダースコア) は、画像解析のコア処理をまとめたPythonパッケージです。同じサーバーを二重に配置しているわけではありません。
docker/vision-mcp/ ← プロジェクト全体(NASでの配置例)
├─ docker-compose.yaml ← コンテナの起動・ポート・共有フォルダー設定
├─ Dockerfile ← コンテナイメージのビルド定義
├─ .env ← APIキーなどの運用設定(Git管理外)
├─ .env.example ← 設定のひな形
├─ .dockerignore ← ビルドに含めるファイルの制御
├─ requirements.txt ← Pythonライブラリの依存関係
├─ server.py ← サーバーの入口:起動・認証・MCPツール登録
├─ vision_mcp/ ← 画像解析のコア処理
│ ├─ __init__.py ← Pythonパッケージの定義
│ ├─ config.py ← 環境変数から設定を読み込む
│ ├─ images.py ← 画像の読み込み・検証・縮小
│ ├─ vision.py ← OpenAIへの解析依頼・結果の取り出し
│ └─ budget.py ← API呼び出し回数の制限
├─ check_mcp.py ← MCP接続の確認
├─ scripts/
│ └─ Save-VisionClipboard.ps1 ← Windowsのクリップボード画像を共有へ保存
└─ tests/ ← 自動テストserver.pyがMCPの窓口を担当し、vision_mcp/内の処理を呼び出します。PythonコードとDockerfileがこのパッケージ名を参照するため、内側のフォルダー名はvision_mcpのまま使用してください。解析対象の画像を保存するNAS共有(例:/volume1/files/vision-images)は、このプログラム用フォルダーとは別です。
将来ツールを増やす場合は、例えば次のようにパッケージ内にtools/を追加できます。以下は将来の構成例で、現在は未実装です。
vision_mcp/
├─ config.py / images.py / vision.py / budget.py ← 共通処理
└─ tools/
├─ __init__.py
├─ read_text.py ← 文字起こし用の処理
├─ analyze_ui.py ← UI解析用の処理
└─ compare_images.py ← 複数画像の比較用の処理共通の画像入力・API通信・回数制限を再利用し、目的別の指示や処理を追加する構成です。ツールを増やしても、DockerコンテナとStrataに登録するMCPサーバーはvision-mcpの1つのままで、そのサーバーが提供するツールが増えます。実際に追加するときは、server.pyでのツール登録に加え、現在トップ階層のPythonファイルだけを許可している.dockerignoreも更新して、tools/配下をビルドに含めます。
拡張する場所
server.py: ツール登録・HTTP transport・Bearer認証vision_mcp/images.py: 安全な画像入力、形式検証・正規化vision_mcp/vision.py: OpenAIへの1回の呼び出し・観察用指示vision_mcp/config.py: 環境設定vision_mcp/budget.py: 永続的な回数制限
read_text / analyze_ui / describe_chartは共通の入力・API処理を再利用し、観察指示を分離して追加できます。compare_imagesは複数画像の合計サイズ・費用制限と入力スキーマを追加する必要があります。
This server cannot be deployed
Maintenance
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Focused MCP server for OpenAI image/audio generation (v2.0.0). Wraps endpoints via HAPI CLI.
Analyze images from multiple angles to extract detailed insights or quick summaries. Describe visu…
Generate AI images and videos from any compatible MCP client.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides tools for generating and editing images using OpenAI's gpt-image-1 model via an MCP interface, enabling AI assistants to create and modify images based on text prompts.15Apache 2.0
- AlicenseAqualityDmaintenanceMCP server that provides an analyze_image tool using OpenAI-compatible vision LLMs to describe images from file paths, URLs, or base64 data.110 npm1MIT
- FlicenseNot gradedqualityCmaintenanceProvides an MCP tool that analyzes images from local paths, URLs, or data URLs via a vision language model, returning structured descriptions (brief, detailed, summary) so text-only LLMs can understand image content.-
- AlicenseNot gradedqualityCmaintenanceEnables MCP-compatible agents to analyze images via NVIDIA NIM vision models, supporting file paths, URLs, or base64 input to return actionable textual descriptions.13 npmMIT