Skip to content

plain-sight Handbook

plain-sight is a local, MIT-licensed image describer. Point it at an image and an AI (Florence-2) says what it sees — as a one-line caption, a detailed paragraph, or the text read off the pixels. It ships as an MCP server for Claude and a CLI for shells and scripts, sharing one engine.

You want…Use
“What is in this image?” in prosedescribe_image / plain-sight describe
.txt caption sidecars for a LoRA training setdescribe_batch / plain-sight batch
The text visible inside an imageread_text / plain-sight ocr
“Does this image contain X?” as a scoreai-eyes-mcp — not this tool

plain-sight is one half of a deliberate pair:

ai-eyes-mcpplain-sight
Jobjudges imagesdescribes images
ModelSigLIP2 (discriminative)Florence-2 (generative)
Outputcalibrated scoresprose / OCR / caption files
Failure modecan’t narratecan hallucinate detail

Descriptions are generative: fluent, usually accurate, and capable of inventing detail. plain-sight makes output reproducible (deterministic decoding), not guaranteed true. When a specific claim matters, verify it with ai-eyes — the two tools are different model families by design, so one can check the other.

engine.py Florence-2 wrapper — no MCP dependency, lazy load,
validation BEFORE the model loads.
sidecars.py The training-data contract, pure stdlib: basename
pairing, bare concatenation, directory expansion.
server.py FastMCP layer: 5 tools, structured errors.
cli.py argparse CLI: 5 commands, real exit codes.

A cloud sibling of the same contract runs on Comfy Cloud as the caption-florence2-v1 workflow (one image per job, metadata-rider use). This tool is the bulk lane: on a modern GPU it captions at roughly one image per second, entirely locally.