Skip to content
AEai-eyes
v1.2.0 · 8 MCP tools · 207 tests

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 measured

Find 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.