Skip to main content
Glama

VLM-MCP

GitHub License: MIT Python 3.11+ MCP

English | 中文

MCP-сервер для понимания изображений на основе VLM. Поддерживает локальный llama.cpp и онлайн-VLM (например, Qwen3-VL-Flash) через единый OpenAI-совместимый API.


English

Возможности

  • Два бэкенда: локальный llama.cpp + онлайн Qwen3-VL-Flash, единый OpenAI-совместимый API

  • Трёхуровневый кэш: L1 — кэш кодирования изображений, L2 — кэш ответов (с TTL), L3 — KV-кэш llama-server

  • Управление сессиями: контекст многоходовых диалогов, автоматическое вытеснение и очистка по таймауту

  • Шаблоны промптов: встроенные describe / ocr / chart / translate / qa

  • Управление жизненным циклом: подпроцесс llama-server автоматически запускается и останавливается вместе с MCP, ручное управление не требуется

  • Здоровье бэкендов: автоматическое отключение бэкендов при ошибках API-ключа, поддержка ручного включения/отключения

  • Многоисточниковые изображения: локальный путь, HTTP URL, Base64 Data URI, резервный вариант с чистым Base64

Архитектура

MCP Client (SSE :11432)
       │
       ▼
  server.py ── tool layer (analyze_image / create_session / ...)
       │
       ├── session_manager.py ── session lifecycle
       ├── cache.py ── L1 image cache + L2 response cache
       ├── image_utils.py ── image parsing (path/URL/Base64)
       │
       ▼
  providers/ ── OpenAI-compatible interface
       │
       ├── llama-cpp (localhost:11433) ← auto-launched by llama_launcher.py
       └── qwen-vl (dashscope API)

Быстрый старт

Требования

Компонент

Примечания

Python 3.11+

Среда выполнения

uv

Менеджер пакетов

llama.cpp

Нативный бинарник (llama-server), требуется сборка CUDA

Qwen3-VL-8B GGUF

Языковая модель + визуальный проектор

Примечание: этот проект использует нативный бинарник llama.cpp (llama-server), а НЕ llama-cpp-python. Python-привязки не нужны — просто скачайте исполняемый файл llama.cpp.

Рекомендуемая модель: скачайте два файла из Qwen3-VL-8B-Instruct-GGUF:

Файл

Рекомендуемый

Примечания

Модель зрения

Qwen3VL-8B-Instruct-Q4_K_M.gguf

Квантование Q4_K_M, баланс скорости и точности

Визуальный проектор

mmproj-Qwen3VL-8B-Instruct-F16.gguf

Должен быть F16, не квантовать

8 ГБ видеопамяти достаточно. В режиме только онлайн (только бэкенд qwen-vl) можно пропустить llama.cpp и GGUF-модели.

Установка

git clone https://github.com/YC-CLT/VLM-mcp.git
cd VLM-mcp
uv sync

Настройка

cp config.example.json config.json

Отредактируйте config.json:

{
  "backends": {
    "llama-cpp": {
      "enabled": true,
      "base_url": "http://localhost:11433/v1",
      "api_key": "sk-no-key-required",
      "model_name": "qwen3-vl"
    },
    "qwen-vl": {
      "enabled": false,
      "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
      "api_key": "your-dashscope-api-key",
      "model_name": "qwen-vl-flash"
    }
  },
  "default_backend": "llama-cpp",
  "cache_enabled": true,
  "llama": {
    "server_exe": "llama-server",
    "model": "D:/path/to/Qwen3VL-8B-Instruct-Q4_K_M.gguf",
    "mmproj": "D:/path/to/mmproj-Qwen3VL-8B-Instruct-F16.gguf",
    "ngl": 99
  }
}

Ключевые поля:

  • backends.<name>.enabled: установите false, чтобы вручную отключить бэкенд

  • llama.model / llama.mmproj: абсолютные пути к файлам моделей (обязательно)

  • llama.ngl: слои GPU, 99 = всё на GPU, 0 = только CPU

  • llama.server_exe: исполняемый файл llama-server, по умолчанию ищется в PATH

Запуск

uv run main.py

Подпроцесс llama-server автоматически запускается и останавливается вместе с MCP. Ручное управление не требуется.

MCP SSE endpoint: http://127.0.0.1:11432/sse

Запуск из любой директории: uv run --directory D:\CodeFile\VLM-mcp main.py

Конфигурация MCP-клиента

Добавьте в конфигурацию вашего MCP-клиента:

{
  "mcpServers": {
    "vlm-mcp": {
      "url": "http://127.0.0.1:11432/sse"
    }
  }
}

MCP-инструменты

Инструмент

Параметры

Описание

analyze_image

image, prompt, template, params, backend, session_id

Анализ изображения с поддержкой шаблонов и сессий

create_session

backend

Создание сессии многоходового диалога

close_session

session_id

Закрытие сессии

list_sessions

—

Список всех активных сессий

list_backends

—

Список бэкендов и их статус

list_templates

—

Список доступных шаблонов промптов

Шаблоны

Шаблон

Параметры

Описание

describe

—

Общее описание изображения

ocr

—

Извлечение текста

chart

—

Анализ диаграмм

translate

target_lang

Перевод изображения (по умолчанию: zh)

qa

question

Вопросы и ответы по изображению

Примеры

// Single analysis
{
  "tool": "analyze_image",
  "args": {
    "image": "D:/photos/cat.png",
    "prompt": "What is in this image?"
  }
}

// Using template
{
  "tool": "analyze_image",
  "args": {
    "image": "https://example.com/chart.png",
    "template": "chart"
  }
}

// Multi-turn session
{ "tool": "create_session", "args": { "backend": "llama-cpp" } }
// → { "session_id": "xxx" }
{ "tool": "analyze_image", "args": { "image": "...", "prompt": "...", "session_id": "xxx" } }
{ "tool": "analyze_image", "args": { "prompt": "Tell me more", "session_id": "xxx" } }
{ "tool": "close_session", "args": { "session_id": "xxx" } }

Константы конфигурации

Неконфиденциальные константы в config.py:

Константа

По умолчанию

Описание

IMAGE_MAX_SIZE_MB

20

Максимальный размер изображения

IMAGE_DOWNLOAD_TIMEOUT

10

Таймаут загрузки изображения (с)

CACHE_IMAGE_MAX_ENTRIES

100

Лимит кэша L1

CACHE_RESPONSE_MAX_ENTRIES

500

Лимит кэша L2

CACHE_RESPONSE_TTL_ONLINE

3600

TTL кэша онлайн-бэкенда (с)

CACHE_RESPONSE_TTL_LOCAL

1800

TTL кэша локального бэкенда (с)

SESSION_TTL

1800

Таймаут сессии (с)

SESSION_MAX

5

Максимум сессий на бэкенд

LOG_LEVEL

"INFO"

Уровень логирования

Разработка

uv sync --dev
uv run pytest tests/ -v

Часто задаваемые вопросы

llama-server работает на CPU?
Проверьте llama.ngl в config.json — 99 = всё на GPU, 0 = только CPU.

llama-server не запускается?
Убедитесь, что server_exe исполняемый и пути model/mmproj существуют. Проверьте llama_server.log.

Онлайн-бэкенд возвращает 401?
Недействительный API-ключ автоматически отключает бэкенд. Установите корректный ключ и перезапустите. Или установите "enabled": false, чтобы пропустить.

Конфликт портов?
MCP порт 11432, порт llama-server 11433. Измените llama.port в config.json или порт в server.py.


Related MCP server: MCP Vision Server

中文

特性

  • 双后端支持:本地 llama.cpp + 在线 Qwen3-VL-Flash,统一 OpenAI 兼容 API

  • 三层缓存:L1 图片编码缓存、L2 响应缓存(带 TTL)、L3 llama-server KV Cache

  • 会话管理:多轮对话上下文保持,自动淘汰与超时清理

  • 提示词模板:内置 describe / ocr / chart / translate / qa 模板

  • 生命周期管理:llama-server 子进程与 MCP 同起同停,启动即用,无需手动管理

  • 后端健康:API Key 错误自动禁用后端,支持手动启用/禁用

  • 多图片来源:本地路径、HTTP URL、Base64 Data URI、纯 Base64 回退

架构

MCP Client (SSE :11432)
       │
       ▼
  server.py ── 工具层 (analyze_image / create_session / ...)
       │
       ├── session_manager.py ── 会话生命周期
       ├── cache.py ── L1 图片缓存 + L2 响应缓存
       ├── image_utils.py ── 图片解析 (路径/URL/Base64)
       │
       ▼
  providers/ ── OpenAI 兼容接口
       │
       ├── llama-cpp (localhost:11433) ← llama_launcher.py 自动启动
       └── qwen-vl (dashscope API)

快速开始

环境要求

组件

说明

Python 3.11+

运行环境

uv

包管理

llama.cpp

原生二进制(llama-server),需 CUDA 版

Qwen3-VL-8B GGUF

语言模型 + 视觉投影器

注意:本项目使用 llama.cpp 原生二进制(llama-server),不是 llama-cpp-python。 无需安装 Python 绑定(即无需llama-cpp-python,这个和单llama.cpp相互独立),只需下载 llama.cpp 可执行文件即可。

推荐模型下载:从 Qwen3-VL-8B-Instruct-GGUF 下载两个文件:

文件

推荐

说明

视觉模型

Qwen3VL-8B-Instruct-Q4_K_M.gguf

Q4_K_M 量化,平衡速度与精度

图像编码器

mmproj-Qwen3VL-8B-Instruct-F16.gguf

建议 F16,不必量化

这样8G显存就可以跑

纯在线模式(仅用 qwen-vl 后端)可跳过 llama.cpp 和 GGUF 模型。

安装

git clone https://github.com/YC-CLT/VLM-mcp.git
cd VLM-mcp
uv sync

配置

cp config.example.json config.json

编辑 config.json:

{
  "backends": {
    "llama-cpp": {
      "enabled": true,
      "base_url": "http://localhost:11433/v1",
      "api_key": "sk-no-key-required",
      "model_name": "qwen3-vl"
    },
    "qwen-vl": {
      "enabled": false,
      "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
      "api_key": "your-dashscope-api-key",
      "model_name": "qwen-vl-flash"
    }
  },
  "default_backend": "llama-cpp",
  "cache_enabled": true,
  "llama": {
    "server_exe": "llama-server",
    "model": "D:/path/to/Qwen3VL-8B-Instruct-Q4_K_M.gguf",
    "mmproj": "D:/path/to/mmproj-Qwen3VL-8B-Instruct-F16.gguf",
    "ngl": 99
  }
}

关键字段:

  • backends.<name>.enabled:设为 false 可手动禁用后端

  • llama.model / llama.mmproj:本地模型文件绝对路径(必填)

  • llama.ngl:GPU 层数,99 表示全部 offload 到 GPU,0 为纯 CPU

  • llama.server_exe:llama-server 可执行文件,默认从 PATH 查找

运行

uv run main.py

启动后会自动拉起 llama-server 子进程,MCP 退出时自动停止。无需手动管理 llama-server。

MCP SSE 端点:http://127.0.0.1:11432/sse

从任意目录运行:uv run --directory D:\CodeFile\VLM-mcp main.py

MCP 客户端配置

在你的 MCP 客户端配置文件中添加:

{
  "mcpServers": {
    "vlm-mcp": {
      "url": "http://127.0.0.1:11432/sse"
    }
  }
}

MCP 工具

工具

参数

说明

analyze_image

image, prompt, template, params, backend, session_id

分析图片,支持模板和会话

create_session

backend

创建多轮对话会话

close_session

session_id

关闭会话

list_sessions

—

列出所有活跃会话

list_backends

—

列出后端及其状态

list_templates

—

列出可用提示词模板

模板

模板

参数

说明

describe

—

通用图片描述

ocr

—

文字提取

chart

—

图表分析

translate

target_lang

图片翻译(默认中文)

qa

question

图片问答

使用示例

// 单次分析
{
  "tool": "analyze_image",
  "args": {
    "image": "D:/photos/cat.png",
    "prompt": "这张图片里有什么?"
  }
}

// 使用模板
{
  "tool": "analyze_image",
  "args": {
    "image": "https://example.com/chart.png",
    "template": "chart"
  }
}

// 多轮会话
{ "tool": "create_session", "args": { "backend": "llama-cpp" } }
// → { "session_id": "xxx" }
{ "tool": "analyze_image", "args": { "image": "...", "prompt": "...", "session_id": "xxx" } }
{ "tool": "analyze_image", "args": { "prompt": "继续分析", "session_id": "xxx" } }
{ "tool": "close_session", "args": { "session_id": "xxx" } }

配置常量

非敏感常量集中于 config.py,可在代码中直接修改:

常量

默认值

说明

IMAGE_MAX_SIZE_MB

20

图片最大体积

IMAGE_DOWNLOAD_TIMEOUT

10

图片下载超时(秒)

CACHE_IMAGE_MAX_ENTRIES

100

L1 缓存上限

CACHE_RESPONSE_MAX_ENTRIES

500

L2 缓存上限

CACHE_RESPONSE_TTL_ONLINE

3600

在线后端缓存 TTL(秒)

CACHE_RESPONSE_TTL_LOCAL

1800

本地后端缓存 TTL(秒)

SESSION_TTL

1800

会话超时(秒)

SESSION_MAX

5

每后端最大会话数

LOG_LEVEL

"INFO"

日志级别

开发

uv sync --dev
uv run pytest tests/ -v

常见问题

llama-server 跑在 CPU 上?
检查 config.json 中 llama.ngl 是否为 99(全 GPU),0 为纯 CPU。

llama-server 启动失败?
确认 server_exe 可执行(PATH 中或绝对路径),model/mmproj 路径存在。查看 llama_server.log。

在线后端 401 错误?
API Key 无效时会自动禁用该后端,设好 Key 后重启即可恢复。也可手动设 "enabled": false 跳过。

端口被占用?
MCP 端口 11432,llama-server 端口 11433。修改 config.json 中 llama.port 或 server.py 中端口号。

许可

MIT

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides advanced image analysis capabilities including object recognition, OCR text extraction, and multi-turn visual dialogues using OpenAI-compatible APIs. It supports both local files and Base64 inputs with additional features for session persistence and web-based configuration management.
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to analyze images using any OpenAI-compatible vision API, providing tools for image analysis, OCR, error diagnosis, diagram understanding, and chart analysis.
    MIT