Local vision MCP server with pluggable backends (Ollama, OpenAI-compatible, Anthropic, Gemini), OCR, inspection, annotation, layout, reconstruction and comparison.
shadow-vision provides 6 well-structured vision tools with complete input schemas and clear descriptions. All tools follow verb_noun naming (vision_*) and accept multiple input formats (file path, base64, URL). Schemas are properly typed with enums for constrained parameters. However, output schemas are not documented, LLMs cannot predict response structure for downstream planning. Error handling is absent from visible code. Parameter descriptions are adequate but lack format/constraint details (e.g., no guidance on base64 encoding, MIME type format, or expected JSON structure for reference_layout). No tool annotations (readOnlyHint, idempotentHint) despite all being read-only operations. Missing required/optional field declarations in schemas.
Identify user's visual annotations (circles, arrows, underlines, highlights, scribbles, handwritten text) and their targets, returning structured JSON.
Analyze multiple related images (diff, compare, sequence) in one call.
Describe or answer questions about an image. Pass image_path (local file) or image_base64 + mime_type.
Analyze an image's layout structure and return structured JSON (canvas, elements, relations).
Extract all text from an image. Pass image_path (local file) or image_base64 + mime_type.
Reconstruct a screenshot into code (html/react/svg) with a model self-check.
Output schemas not documented. LLMs cannot predict response structure (JSON fields, types, nesting) for vision_ocr, vision_inspect, vision_annotate, vision_layout, vision_reconstruct, vision_compare. This forces agents to guess at response format and breaks downstream tool chaining.
No tool annotations (readOnlyHint, idempotentHint, destructiveHint). All 6 tools are read-only and idempotent, but this is not declared in the schema. LLMs cannot determine safety/retry semantics without explicit hints.
Input schemas lack required/optional field declarations. All parameters appear optional (no 'required' array in inputSchema). vision_ocr and vision_inspect need at least one image source (image_path, image_base64, or image_url), but this mutual-exclusivity constraint is not expressed in the schema.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Parameter descriptions lack format/constraint details. 'image_base64' has no guidance on encoding (standard base64? URL-safe?). 'mime_type' has example 'image/png' but no enum or pattern. 'reference_layout' (vision_reconstruct) says 'Optional JSON output from vision_layout' but does not document expected schema.
No error handling guidance in visible code. If an image fails to load, model inference times out, or base64 is malformed, LLMs receive no recovery hints. Error responses should guide: 'Image too large (>50MB). Try a smaller file or compress it.' instead of raw exceptions.