Your model can look at the image. This one can be wrong about it.
Generative vision models hallucinate confident answers because they complete narratives. ai-eyes measures one image-text pair with SigLIP2 and returns a calibrated score — on weights it names, with a flag when it only saw part of your query, and a refusal when the number would not mean anything.
Ask
image_contains("sprite.png", "a knight with a sword")
Get
{ "present": true, "score": 0.6847,
"truncated": false,
"revision": "e8e4872..." }
Rank
image_rank(reference="canon.png",
candidates=[...],
baselines=[["a.png","b.png"]])
Measurement, not narration
One claim, defended in the code rather than the copy.
It names its weights
The model revision is pinned to a commit SHA and reported in every payload that contains a number. A floating branch means two installs can disagree and never say so — this one refuses branch names outright.
It tells you what it did not read
The text encoder holds 64 tokens. A longer query is scored on its prefix — so the payload carries truncated: true rather than presenting a partial measurement as a whole one.
It abstains
Cosine similarity between two different characters in one art style measured 0.698–0.836. There is no universal cutoff, so image_compare and image_rank take contrast pairs from you and return incomplete rather than inventing a threshold.
It will not contradict itself
Verdicts are decided at full precision and rounded only for display, never far enough to disagree with the number printed beside them. A measured non-zero never prints as zero.
Local, and quiet about it
All inference runs on your machine. The one network call is the first-run model download; point AI_EYES_MODEL_DIR at a pre-populated cache and there are none at all.
Proves itself on install
eyes_selftest runs known orderings on bundled reference images and reports the revision it used — so a broken cache or a swapped model surfaces immediately, not as quietly wrong scores.
Usage
Install
git clone https://github.com/mcp-tool-shop-org/ai-eyes-mcp
cd ai-eyes-mcp
pip install -e .Register with Claude Code
{
"mcpServers": {
"ai-eyes": {
"command": "ai-eyes-mcp",
"env": { "AI_EYES_MODEL_DIR": "/path/to/cache" }
}
}
}Verify a claim about pixels
image_verify(
image_path="sprite.png",
target="a knight with a sword",
alternatives=["a goblin cook", "a bard"],
)
# → decision + margin + a confidence band
# that describes the gap it measuredFind the closest match, or none
image_rank(
reference="canon/knight.png",
candidates=generated_frames,
baselines=[["knight.png", "cook.png"]],
)
# matches: [] when nothing clears the floor
# you supplied. No forced top-k.