mcp-six-eyes
MCP server that gives text-only AI agents the ability to understand images via vision tools, including multi-image analysis, OCR, comparison, and structured extraction. It uses providers like OpenAI, Anthropic, Gemini, and OpenRouter to return plain text descriptions.
README
<p align="center"> <img src="assets/logo.png" alt="mcp-six-eyes logo" width="180" height="180" /> </p>
mcp-six-eyes
MCP server that gives text-only AI agents the ability to understand images, including multi-image chats like “refer image 1 and 2” or “compare these screenshots.”
Text-only models cannot see pixels. This server bridges that gap: agents call vision tools, the server talks to a multimodal API, and the agent gets plain text back.
Agent (text-only)
│ tool call: analyze / compare / refer / ocr / …
▼
mcp-six-eyes (this server)
│ 1..N images: path | URL | base64 (labels: 1, 2, before, …)
▼
Vision API (OpenAI / Anthropic / Gemini / OpenRouter / custom)
│
▼
Plain-text description / OCR / comparison / structured extract
│
▼
Agent continues reasoning with text
Why this works
MCP exposes tools an agent can call. The agent never needs native vision:
- User uploads or points at one or more images
- Agent calls a vision tool with those sources (and optional labels)
- Server loads the image(s) and sends them to a multimodal model
- Server returns only text, with stable image labels
- The text-only agent uses that text like any other tool result
Tools
| Tool | Purpose |
|---|---|
analyze_image |
General Q&A over one or more images |
describe_image |
Dense scene/UI description (great “context dump” for agents) |
ocr_image |
Extract visible text (per-image sections when multi) |
compare_images |
Diff 2+ images (before/after, A/B, variants) |
refer_images |
Answer questions that cite “image 1”, “both figures”, etc. |
inspect_ui |
UI/UX screenshot review and multi-step flows |
read_chart |
Charts, plots, tables, dashboards |
explain_diagram |
Architecture / flowchart / ERD / whiteboard explainers |
extract_from_images |
Structured JSON from forms, receipts, tables, labels |
vision_status |
Show configured provider/model and limits |
Image inputs
Every image tool accepts:
- Single:
image: local path,file://,http(s), data URL, or base64 - Multi:
images: array of sources or{ source, label?, mimeType? }objects - You can pass both; they are merged
Labels default to "1", "2", … so agent prompts like “compare image 1 and 2” map cleanly. Custom labels work too ("before", "after", "fig-a").
# one image
analyze_image({ image: "./shot.png", prompt: "What failed?" })
# multi-image with default labels 1..n
compare_images({
images: ["./a.png", "./b.png"],
prompt: "What changed in the error state?"
})
# multi-image with explicit labels (best for long threads)
refer_images({
images: [
{ source: "./login.png", label: "1" },
{ source: "./dashboard.png", label: "2" }
],
prompt: "Using image 1 and image 2, is the user authenticated?"
})
Supported source forms:
- local file path (
/path/to/image.pngorC:\path\to\image.png) file://URIhttp(s)URL- data URL (
data:image/png;base64,...) - raw base64 (pass
mimeTypewhen possible)
Requirements
- Node.js 20+
- A vision-capable API key (OpenAI, Anthropic, Google, OpenRouter, or any OpenAI-compatible endpoint)
Install
Published on npm as mcp-six-eyes.
npx -y mcp-six-eyes
Or install globally / as a project dependency:
npm install -g mcp-six-eyes
# or
npm install mcp-six-eyes
Most people wire it into an MCP client instead of running it by hand. Example Claude Desktop / Cursor config:
{
"mcpServers": {
"mcp-six-eyes": {
"command": "npx",
"args": ["-y", "mcp-six-eyes"],
"env": {
"VISION_PROVIDER": "openai",
"OPENAI_API_KEY": "sk-..."
}
}
}
}
Why npx is popular here:
- no global install
- client starts the server on demand
-yskips the install prompt on first run- npm caches the package for later launches
Local development
npm install
npm run build
Then either:
{
"mcpServers": {
"mcp-six-eyes": {
"command": "npx",
"args": ["-y", "."],
"env": {
"VISION_PROVIDER": "openai",
"OPENAI_API_KEY": "sk-..."
}
}
}
}
or point Node at the built entrypoint:
{
"mcpServers": {
"mcp-six-eyes": {
"command": "node",
"args": ["./build/index.js"],
"env": {
"VISION_PROVIDER": "openai",
"OPENAI_API_KEY": "sk-..."
}
}
}
}
Environment
Set provider keys in the MCP client env block (recommended) or a local .env for development.
Minimal OpenAI setup:
VISION_PROVIDER=openai
OPENAI_API_KEY=sk-...
Optional model / limits:
VISION_MODEL=gpt-4o-mini
VISION_MAX_IMAGES=10
VISION_MAX_IMAGE_BYTES=20971520
The server speaks MCP over stdio. Do not write application logs to stdout.
Client notes
Claude Desktop
Config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%AppData%\Claude\claude_desktop_config.json
Use the npx block from Quick start with npx.
Cursor
Add the same server block to .cursor/mcp.json (project) or your global Cursor MCP config.
Other stdio MCP hosts
Any host that can spawn:
npx -y mcp-six-eyes
and pass environment variables will work.
Providers
| Provider | VISION_PROVIDER |
Key env var | Default model |
|---|---|---|---|
| OpenAI | openai |
OPENAI_API_KEY |
gpt-4o-mini |
| Anthropic | anthropic |
ANTHROPIC_API_KEY |
claude-sonnet-4-5 |
| Google Gemini | google |
GOOGLE_API_KEY |
gemini-2.0-flash |
| OpenRouter | openrouter |
OPENROUTER_API_KEY |
openai/gpt-4o-mini |
| Custom OpenAI-compatible | custom |
VISION_API_KEY + VISION_BASE_URL |
set VISION_MODEL |
Optional fallback:
VISION_FALLBACK_PROVIDER=anthropic
ANTHROPIC_API_KEY=sk-ant-...
Example agent usage
Single screenshot
User: What's wrong in this screenshot? ./screenshots/build-error.png
Agent → ocr_image({ image: "./screenshots/build-error.png" })
Agent → analyze_image({
image: "./screenshots/build-error.png",
prompt: "Explain the error and suggest a fix"
})
Agent → answers in plain text
Multi-image: refer / compare
User: I uploaded two shots. Compare image 1 and 2. Did the fix work?
Agent → compare_images({
images: [
{ source: "./before.png", label: "1" },
{ source: "./after.png", label: "2" }
],
prompt: "Did the red error banner disappear after the fix?"
})
User: Refer image 1 and image 2. Which CTA is primary?
Agent → refer_images({
images: [
{ source: "./landing-a.png", label: "1" },
{ source: "./landing-b.png", label: "2" }
],
prompt: "Which image has the stronger primary CTA and why?"
})
UI flow, chart, diagram, structured extract
inspect_ui({
images: ["./step1.png", "./step2.png", "./step3.png"],
prompt: "Describe the checkout flow and any friction"
})
read_chart({
image: "https://example.com/revenue.png",
prompt: "Summarize the trend and call out outliers"
})
explain_diagram({
image: "./architecture.png",
prompt: "List services and data flow"
})
extract_from_images({
image: "./receipt.jpg",
schema: "{\"merchant\":string,\"date\":string,\"total\":number,\"items\":[{\"name\":string,\"price\":number}]}"
})
Architecture
src/
index.ts MCP server + tools
config.ts env/provider config
image.ts path/URL/base64 loader + multi-image labels
prompts.ts task prompts (analyze/describe/ocr/compare/...)
providers/
index.ts provider router + fallback
openai-compatible.ts OpenAI / OpenRouter / custom (multi-image)
anthropic.ts Claude vision (multi-image)
google.ts Gemini vision (multi-image)
types.ts shared contracts
test/ unit tests (node:test, mocked providers)
assets/
logo.png project logo
Design notes
- Tools, not resources: image understanding is an action with side effects (API cost), so it is exposed as tools.
- Text-only output: host models without vision only need text content blocks.
- Labeled multi-image: agents in chat UIs talk about “image 1/2”; labels keep that grounding stable.
- Task-specific tools: compare / refer / UI / chart / diagram / extract beat one mega-prompt for tool selection.
- Stdio transport: simplest local integration for desktop agents.
- No stdout logging: stdout is reserved for JSON-RPC; diagnostics go to stderr.
- Provider abstraction: swap backends without changing tool names the agent learns.
Development
npm install
npm test
npm start
| Script | Purpose |
|---|---|
npm run build |
Compile TypeScript to build/ |
npm run typecheck |
Typecheck only |
npm test |
Build + full unit test suite |
npm run test:unit |
Run tests against current build/ |
npm run smoke |
Quick image-loader smoke script |
npm start |
Run MCP server on stdio |
Debug with the MCP Inspector:
npx @modelcontextprotocol/inspector node ./build/index.js
See CONTRIBUTING.md for PR and coding guidelines.
Links
- npm: mcp-six-eyes
- Maintainer: rimunace
Release workflow
Maintainer path after local changes:
# one-time
npm login
# bump version + CHANGELOG, then ship
npm test
npm publish --access public
Optional helper (tests, then npm publish):
npm run release
Security
- API keys stay in environment variables / client config, never in tool responses
- Remote URL fetches are explicit tool inputs; treat untrusted URLs carefully
- Large images are rejected via
VISION_MAX_IMAGE_BYTES(default 20MB) - Image count per call is capped via
VISION_MAX_IMAGES(default 10)
Full policy: SECURITY.md.
Contributing
Issues and pull requests are welcome. Please run npm test before opening a PR and read CONTRIBUTING.md.
License
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。