Skip to main content
Glama
carlleilzj
by carlleilzj

image-recognition-mcp

Powered by RustChain

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 shot

MCP 도구 설명

서버가 시작되면 클라이언트에 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 매개변수)

형식

예시

설명

로컬 절대 경로

/Users/me/Pictures/x.png

가장 일반적

상대 경로

shot.png / ./imgs/x.png

클라이언트 작업 디렉터리 기준

data URI

data:image/png;base64,iVBORw0KG...

사용자가 이미지를 직접 붙여넣을 때 흔함

순수 base64

iVBORw0KG...

폴백(자동 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에서 이미지 @참조

이미지 절대 경로가 컨텍스트에 주입됨

시각 기능 없는 모델이 경로를 확인 → ocr_image(path) 호출

✅ 자동

세션에 이미지 드래그 / 스크린샷 붙여넣기

일부 클라이언트는 data URI로 주입

시각 기능 없는 모델이 data URI를 확인 → ocr_image(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-recognitionmcpServers에 추가하고 재시작하면 적용됩니다:

WorkBuddy

참고 설정 예시는 configs/ 디렉터리에 있습니다:

  • configs/opencode.example.json

  • configs/claude-desktop.example.json

  • configs/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)에 권한을 부여하세요.

    • 권한이 없으면 도구가 명확한 오류 메시지를 반환하며, 조용히 실패하지 않습니다.


문제 해결

문제

원인 및 해결 방법

ModuleNotFoundError: No module named 'pyobjc.framework.Vision'

의존성이 설치되지 않음. venv에서 pip install -r requirements.txt 실행.

ModuleNotFoundError: No module named 'mcp.server.fastmcp'

fastmcp는 mcp<2.0에서만 사용. 이 프로젝트는 1.x와 2.0을 지원. 다운그레이드 필요 시: pip install 'mcp>=1.2,<2.0'.

OCR 중국어 인식이 비어 있거나 깨짐

이미지가 선명한지 확인. 중국어 이미지가 너무 작게 축소(< 16px 글자 크기)되면 인식 실패. level="accurate"로 설정하고 글자 크기를 키워보세요.

분류 결과 이상(예: 순수 텍스트 이미지에 "sport" 반환)

Vision 분류는 일부 장면의 경계가 모호한 것이 정상적인 동작. min_confidence를 높여(0.2~0.5) 노이즈를 필터링하세요.

screenshot_and_recognize 오류 "스크린샷 실패"

화면 기록 권한이 없음. 「시스템 설정 > 개인정보 보호 및 보안 > 화면 기록」에서 호스트 앱에 권한을 부여한 후 재시도.

MCP 클라이언트 연결 후 도구 목록이 비어 있음

command 경로가 올바른지 확인. venv의 python 인터프리터가 import vision_engine을 성공적으로 수행하는지 확인.


확장 제안

더 많은 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에서만 실행할 수 있습니다.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Provides 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.
    5
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP 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.
    1
    MIT