image-recognition-mcp
image-recognition-mcp
macOS 로컬 Vision 프레임워크 기반 이미지 인식 MCP 서버 — 시각 기능이 없는 AI 모델도 스크린샷과 이미지를 "볼" 수 있게 해줍니다.
AI 클라이언트(opencode / Claude Desktop / Cursor / Cline 등)에 4개의 MCP 도구를 제공합니다:
OCR 텍스트 인식 / 이미지 주제 분류 / 종합 인식 / 스크린샷 촬영 및 인식. 전 과정이 로컬에서 추론되며, 데이터가 기기를 벗어나지 않습니다.
목차
Related MCP server: npu-vision-fallback
특징
100% 로컬 추론: Apple Vision 프레임워크(
VNRecognizeTextRequest+VNClassifyImageRequest) 기반, 네트워크 요청 0회, 외부 API 호출 0회.중·영문 혼합 OCR: 중국어(zh-Hans), 영어 및 20+개 언어 지원, 필기체 인식 포함, 정밀도 단계 선택 가능(accurate / fast).
이미지 주제/장면 분류: 카테고리 라벨과 신뢰도를 반환하며, 모델이 이를 기반으로 자연어 설명을 생성할 수 있습니다.
세 가지 이미지 소스: 로컬 경로,
data:image/png;base64,...URI, 순수 base64(PNG 매직 넘버 검증).대형 이미지 자동 축소: 기본적으로 4096px를 초과하는 이미지는 자동으로 축소본을 생성한 후 인식하므로 속도가 빠르고 메모리 사용이 적습니다.
구조화된 JSON 출력: 모든 도구가 통일된
{status, ...}JSON을 반환하며, 신뢰도와 정규화된 경계 상자를 포함하여 모델이 파싱하고 참조하기 쉽습니다.선택적 스크린샷:
screencapture명령을 직접 호출하여 화면을 캡처하고 인식합니다(화면 기록 권한 필요).
아키텍처
┌────────────────────────────────────────────────────────────┐
│ AI 会话客户端(opencode / Claude Desktop / Cursor / ...) │
│ 无视觉模型看到图片路径 → 调用工具 │
└──────────────────────────┬─────────────────────────────────┘
│ MCP 协议 (stdio JSON-RPC)
┌──────────────────────────▼─────────────────────────────────┐
│ image-recognition MCP 服务器 (Python + MCPServer) │
│ ┌──────────────┬──────────────┬──────────────┐ │
│ │ ocr_image │recognize_image│describe_image│ │
│ │screenshot_… │ │ │ │
│ └──────────────┴──────────────┴──────────────┘ │
└──────────────────────────┬─────────────────────────────────┘
│ Vision 框架调用 (pyobjc)
┌──────────────────────────▼─────────────────────────────────┐
│ macOS 本地视觉引擎 │
│ VNRecognizeTextRequest —— OCR(中英+多语言) │
│ VNClassifyImageRequest —— 图像主体/场景分类 │
│ 全程本机推理,无网络请求,数据不出设备 │
└────────────────────────────────────────────────────────────┘빠른 시작
환경 요구 사항
macOS 13+(14+ 권장, Vision 프레임워크의 중국어 인식 품질이 가장 우수)
Python 3.10+(3.13.12로 테스트 완료)
Xcode Command Line Tools 설치됨(
xcode-select --install)
설치
# 克隆/进入项目目录
cd /path/to/image-recognition-mcp
# 创建 venv 并安装依赖
python3 -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -r requirements.txt자체 테스트
# 生成一张含中英文的测试图片
.venv/bin/python scripts/make_test_image.py
# 直接测试 Vision 引擎(不走 MCP)
.venv/bin/python scripts/test_engine.py sample/test_card.png
# 端到端测试 MCP 服务器(启动 stdio,列出工具,调用 OCR)
.venv/bin/python scripts/test_mcp.py sample/test_card.png예상 출력: 3줄의 텍스트(MacBook Air 图片识别测试 / Hello Vision OCR 12345 / 日期:2026-08-04 13:30)가 완전히 인식되고, 이미지 분류 결과가 합리적이어야 합니다(document/printed_page/screenshot 등).
엔진 직접 명령줄 호출(선택 사항)
# OCR
.venv/bin/python vision_engine.py /path/to/image.png --mode ocr
# 主体分类
.venv/bin/python vision_engine.py /path/to/image.png --mode classify
# 综合识别
.venv/bin/python vision_engine.py /path/to/image.png --mode analyze
# 截屏到 ~/Pictures
.venv/bin/python vision_engine.py --mode shotMCP 도구 설명
서버가 시작되면 클라이언트에 4개의 도구가 노출됩니다:
1. ocr_image — 이미지에서 텍스트 추출(OCR)
{
"image": "/Users/me/Pictures/shot.png", // 必填,路径 / data URI / 纯 base64
"languages": "zh-Hans,en-US", // 可选,逗号分隔,顺序即优先级
"min_confidence": 0.2, // 可选,0~1,过滤低置信度结果
"filter_noise": true // 可选,默认 true,过滤图标/符号误识噪声
}filter_noise 설명: 스크린샷의 아이콘 오인식 노이즈(예:
•••,③, 단독8/凸등)를 자동으로 필터링하지만, 비즈니스 의미가 있을 수 있는 숫자 문자열(금액, 카드 번호, 거래 번호, 시간 등)은 유지합니다. 필터링된 줄은 반환되는noise필드에 별도로 배치되어 정보가 유실되지 않습니다. 원본 전체 결과가 필요하면filter_noise: false로 설정하세요.
반환:
{
"status": "ok",
"image": "/Users/me/Pictures/shot.png",
"text": "完整拼接的全文",
"count": 3,
"lines": [
{
"text": "MacBook Air 图片识别测试",
"confidence": 0.5,
"bbox": {"x": 0.052, "y": 0.695, "width": 0.555, "height": 0.133}
}
]
}2. recognize_image — 종합 인식
{
"image": "/path/to/img.png",
"languages": "zh-Hans,en-US"
}반환:
{
"status": "ok",
"image": "/path/to/img.png",
"info": {"path": "...", "size_bytes": 12345, "pixel_width": 1200, "pixel_height": 420, "uti": "public.png"},
"ocr": [...],
"classification": [{"label": "document", "confidence": 0.529}, ...],
"summary": "图中文字(OCR):\n... \n图像主体/场景: document(0.53)",
"elapsed_ms": 98
}3. describe_image — 주제/장면 분류
{
"image": "/path/to/img.png",
"top_k": 8, // 1~20
"min_confidence": 0.05
}반환:
{
"status": "ok",
"image": "/path/to/img.png",
"labels": [
{"label": "Animal", "confidence": 0.812},
{"label": "Cat", "confidence": 0.703}
]
}label은 영어입니다(예: Animal / Landscape / Food / Vehicle). 호출 측 모델이 직접 이해하고 번역합니다.
4. screenshot_and_recognize — 스크린샷 촬영 및 인식
{
"languages": "zh-Hans,en-US"
}전체 화면 캡처 → OCR. 화면 기록 권한이 필요하며, 자세한 내용은 권한 및 개인정보를 참조하세요.
입력 및 출력 형식
입력 형식(image 매개변수)
형식 | 예시 | 설명 |
로컬 절대 경로 |
| 가장 일반적 |
상대 경로 |
| 클라이언트 작업 디렉터리 기준 |
data URI |
| 사용자가 이미지를 직접 붙여넣을 때 흔함 |
순수 base64 |
| 폴백(자동 PNG 매직 넘버 검증) |
실측 결과: 데스크톱 스크린샷 256KB → base64 data URI(약 34만 자) → MCP 도구 호출, 유효 텍스트 42줄 + 노이즈 4줄 인식, 소요 시간 약 0.6초, 경로 직접 전달과 결과 동일.
서버는 자동으로 다음을 수행합니다:
경로 존재 여부 검증
data URI / base64 디코딩 후 임시 파일로 저장
형식 지원 검증(CGImageSource 기반, JPEG/PNG/HEIC/TIFF/GIF/BMP/WebP 호환)
출력 형식
모든 도구가 문자열(JSON)을 반환하므로 모델이 직접 파싱하기 쉽습니다.
성공:
{"status": "ok", ...}실패:
{"status": "error", "error": "..."}경계 상자 좌표(bbox)는 정규화된 값(원점이 왼쪽 하단, 0~1)이며 Vision 프레임워크와 일치합니다.
트리거 메커니즘 설명
MCP는 "도구를 모델이 필요에 따라 호출"하는 프로토콜 설계를 채택하므로, 서버는 사용자가 이미지를 업로드했는지 능동적으로 감지할 수 없습니다. "자동 트리거"를 구현하려면 클라이언트/모델 측의 협조가 필요합니다:
트리거 경로
사용자 행동 | 클라이언트 컨텍스트 | 모델 행동 | 도구 호출 |
opencode에서 이미지 | 이미지 절대 경로가 컨텍스트에 주입됨 | 시각 기능 없는 모델이 경로를 확인 → | ✅ 자동 |
세션에 이미지 드래그 / 스크린샷 붙여넣기 | 일부 클라이언트는 data URI로 주입 | 시각 기능 없는 모델이 data URI를 확인 → | ✅ 자동 |
사용자가 "이건 내 스크린샷이야"라고 말하며 붙여넣기 | 경로 / data URI가 컨텍스트에 포함됨 | 위와 동일 | ✅ 자동 |
권장 프롬프트 규약(중요)
100% 트리거를 보장하려면 프로젝트 루트의 AGENTS.md 또는 모델 시스템 프롬프트에 다음을 추가하세요:
## 图片处理约定
当用户消息中出现图片路径或 base64 data URI 时:
- 若当前模型具备视觉能力 → 直接读取图片(不要调用本 MCP 服务器)。
- 若当前模型不具备视觉能力 → **必须**调用 `image-recognition` MCP 服务器的 `ocr_image` 或
`recognize_image` 工具,将识别结果作为图片内容继续处理。
- 工具调用结果已经包含识别出的文字与图像描述,无需再要求用户提供说明。이 규약을 AGENTS.md에 작성하면 opencode / Claude Desktop 등 클라이언트가 해당 지시를 시스템 프롬프트와 함께 모델에 전달하여 진정한 "자동 트리거"를 구현할 수 있습니다.
클라이언트 연동 설정
아래 설정의 절대 경로를 사용자 컴퓨터의 프로젝트 위치로 바꾼 후 해당 클라이언트의 설정 파일에 작성하세요.
opencode
opencode.json(프로젝트 수준) 또는 ~/.config/opencode/opencode.json(사용자 수준)에 작성:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"image-recognition": {
"type": "local",
"command": [
"/path/to/image-recognition-mcp/.venv/bin/python",
"/path/to/image-recognition-mcp/mcp_server.py"
],
"enabled": true
}
}
}opencode를 재시작하면 도구 목록에 image-recognition의 4개 도구가 표시됩니다.
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json에 작성:
{
"mcpServers": {
"image-recognition": {
"command": "/path/to/image-recognition-mcp/.venv/bin/python",
"args": ["/path/to/image-recognition-mcp/mcp_server.py"]
}
}
}Cursor / Cline / 범용 stdio MCP 클라이언트
{
"mcpServers": {
"image-recognition": {
"command": "/path/to/image-recognition-mcp/.venv/bin/python",
"args": ["/path/to/image-recognition-mcp/mcp_server.py"]
}
}
}WorkBuddy
~/.workbuddy/mcp.json을 편집하여 image-recognition을 mcpServers에 추가하고 재시작하면 적용됩니다:
WorkBuddy
참고 설정 예시는 configs/ 디렉터리에 있습니다:
configs/opencode.example.jsonconfigs/claude-desktop.example.jsonconfigs/generic-stdio.example.json
성능 및 리소스
이미지 크기 | OCR 소요 시간(실측 M4 Air) | 메모리 최대치 |
1200×420(테스트 이미지) | ~100 ms | < 50 MB |
1920×1080(스크린샷) | 150–300 ms | ~80 MB |
4096×4096(4K) | 400–800 ms | ~150 MB |
8000×8000(초대형 이미지) | 자동으로 4096px로 축소, 약 500–1200 ms | ~200 MB |
최적화 제안:
_load_cg_image에 4096px 자동 축소가 이미 내장되어 있어 대부분의 스크린샷에 충분합니다.대량의 이미지를 일괄 인식할 경우 클라이언트에서 여러
ocr_image호출을 하나의recognize_image로 병합하여 컨텍스트 토큰 소비를 줄일 수 있습니다.OCR에서
level="fast"를 선택하면 30–50% 빨라지지만 정확도가 약간 낮아집니다(작은 글씨, 필기체).
권한 및 개인정보
완전 로컬: 모든 인식이 macOS Vision 프레임워크 내에서 완료되며, 데이터가 전혀 기기를 벗어나지 않습니다. API Key나 네트워크가 필요 없습니다.
화면 기록 권한(
screenshot_and_recognize도구에만 필요):최초 호출 시 macOS가 팝업을 표시하거나 「시스템 설정 > 개인정보 보호 및 보안 > 화면 기록」에서 권한을 요청합니다.
해당 MCP 서버를 실행하는 호스트 프로세스(예: 터미널, Claude Desktop, opencode)에 권한을 부여하세요.
권한이 없으면 도구가 명확한 오류 메시지를 반환하며, 조용히 실패하지 않습니다.
문제 해결
문제 | 원인 및 해결 방법 |
| 의존성이 설치되지 않음. venv에서 |
|
|
OCR 중국어 인식이 비어 있거나 깨짐 | 이미지가 선명한지 확인. 중국어 이미지가 너무 작게 축소(< 16px 글자 크기)되면 인식 실패. |
분류 결과 이상(예: 순수 텍스트 이미지에 "sport" 반환) | Vision 분류는 일부 장면의 경계가 모호한 것이 정상적인 동작. |
| 화면 기록 권한이 없음. 「시스템 설정 > 개인정보 보호 및 보안 > 화면 기록」에서 호스트 앱에 권한을 부여한 후 재시도. |
MCP 클라이언트 연결 후 도구 목록이 비어 있음 |
|
확장 제안
더 많은 Vision 기능을 추가하려면 vision_engine.py의 기존 함수를 참고하여 해당 Vision 요청을 추가할 수 있습니다. 예:
VNDetectFaceRectanglesRequest— 얼굴 감지VNGenerateAttentionBasedSaliencyImageRequest— 주목 영역VNDetectDocumentSegmentationRequest— 문서 영역 분할(스캔 애플리케이션)VNRecognizeAnimalsRequest— 동물 품종 인식(iOS 15+, macOS 12+)
구현 후 mcp_server.py에 @mcp.tool()을 하나 추가하기만 하면 모델에 노출됩니다.
파일 구조
image-recognition-mcp/
├── README.md # 本文档
├── requirements.txt # Python 依赖
├── vision_engine.py # Vision 框架封装(OCR + 分类 + 截图)
├── mcp_server.py # MCP 服务器主程序
├── scripts/
│ ├── make_test_image.py # 生成含中英文的测试图片
│ ├── test_engine.py # Vision 引擎自测
│ └── test_mcp.py # MCP 服务器端到端冒烟测试
├── configs/ # 客户端配置示例
│ ├── opencode.example.json
│ ├── claude-desktop.example.json
│ └── generic-stdio.example.json
├── sample/
│ └── test_card.png # 测试图片(含中文/英文/数字/红色圆形)
└── .venv/ # Python 虚拟环境(运行后生成)라이선스
이 프로젝트의 코드는 MIT 라이선스입니다. Vision 프레임워크 호출은 Apple SDK 라이선스의 적용을 받으며 macOS에서만 실행할 수 있습니다.
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for visual regression testing: triage a PR's UI diffs from your coding agent.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
MCP server for Qwen Image 3 AI image generation
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for vision AI — screenshots to code, OCR, error diagnosis, and image analysis via OpenAI-compatible APIs.82MIT
- AlicenseAqualityFmaintenanceProvides an MCP server for local low-power screen vision, enabling AI agents to perform OCR and UI detection on inaccessible screens (games, remote desktops) using NPU acceleration and system OCR.51MIT
- AlicenseNot gradedqualityCmaintenanceMCP server that gives Claude and local LLMs access to Apple's on-device frameworks — Vision OCR, NSDataDetector, and Apple Intelligence FoundationModels. Everything runs on your Mac with zero data leaving.1MIT
- FlicenseAqualityDmaintenanceMCP server for vision capabilities, enabling screenshot, camera, and image analysis using Ollama vision models.41-