Luma MCP
# Luma MCP
多模型视觉理解 MCP 服务器,为不支持原生视觉能力的 AI 助手提供统一的图片分析能力。
[English](./docs/README_EN.md) | 中文
## 特性
- **多模型支持**:GLM-4.6V、DeepSeek-OCR、Qwen3-VL-Flash、Doubao-Seed-1.6、Hunyuan-Vision
- **单工具设计**:统一通过 `image_understand` 完成图片理解,兼容旧客户端
- **面向复杂截图优化**:大图自动多裁剪、文本密集场景保真处理
- **统一预处理链路**:本地文件、远程 URL、Data URI 都进入同一套处理流程
- **适用场景完整**:代码截图、UI 截图、报错截图、文档截图、OCR
- **标准 MCP 协议**:可接入 Claude Desktop、Cline、Claude Code 等客户端
- **HTTP / Docker 部署**:局域网内多客户端共享一个实例(v1.7.0+)
- **内置重试**:降低临时网络或模型请求失败带来的影响
## 快速开始
### 前置要求
- Node.js >= 18
- 任意一个模型提供商的 API Key
### 安装
直接通过 `npx` 运行(无需本地安装):
```bash
npx -y luma-mcp
```
或从源码构建:
```bash
git clone https://github.com/JochenYang/luma-mcp.git
cd luma-mcp
npm install
npm run build
```
## 不使用 MCP?Luma Vision Skill(轻量替代)
不想安装 MCP 服务器,或你使用的 AI 客户端(如 Kimi Code)支持 skill 而不支持 MCP?可直接使用仓库内的 `vision-skill/`:
- **安装**:把 `vision-skill/` 目录复制到你所用 agent 的 skills 目录(如 `~/.agents/skills/vision-skill`)
- **激活**:发送图片时以 `/skill luma-vision` 开头,skill 会执行 `scripts/vision.js` 直连视觉模型 API 完成分析
- **配置**:在系统环境变量中设置(与 MCP 版 `custom` provider 共用同一组变量):
| 变量 | 说明 |
| ---- | ---- |
| `CUSTOM_BASE_URL` | OpenAI 兼容 API 地址(默认 `https://api.minimaxi.com/v1`) |
| `CUSTOM_MODEL_NAME` | 模型名称(默认 `MiniMax-M3`) |
| `CUSTOM_API_KEY` | API Key |
**与 MCP 版的差异**:skill 是零依赖轻量脚本,只做"单图直连"——支持本地路径、HTTP(S) URL、Data URI,图片参数留空时自动扫描常见缓存目录找最新图片;但不包含 MCP 版的多裁剪、压缩、重试、SSRF 防护等能力。
## 配置
### 基础配置(npx 方式)
在 MCP 客户端的 `mcpServers` 中注册(Claude Desktop、Cline / VSCode 通用):
```json
{
"mcpServers": {
"luma": {
"command": "npx",
"args": ["-y", "luma-mcp"],
"env": {
"MODEL_PROVIDER": "zhipu",
"ZHIPU_API_KEY": "your-api-key"
}
}
}
}
```
将 `MODEL_PROVIDER` 与对应的 API Key 环境变量替换为实际使用的提供商:
| `MODEL_PROVIDER` | API Key 环境变量 |
| ---------------- | ---------------- |
| `zhipu` | `ZHIPU_API_KEY` |
| `siliconflow` | `SILICONFLOW_API_KEY` |
| `qwen` | `DASHSCOPE_API_KEY` |
| `volcengine` | `VOLCENGINE_API_KEY` |
| `hunyuan` | `HUNYUAN_API_KEY` |
| `custom` | `CUSTOM_API_KEY` + `CUSTOM_BASE_URL` + `CUSTOM_MODEL_NAME` |
默认模型见[提供商密钥](#提供商密钥)表;如需覆盖模型,可追加 `MODEL_NAME` 环境变量,例如:
- `MODEL_NAME=doubao-seed-1-6-vision-250815`(Volcengine 视觉深度思考模型)
- `MODEL_NAME=hy-vision-2.0-instruct`(Hunyuan,腾讯云 TokenHub)
> [!NOTE]
> **混元模型已迁移**:腾讯混元平台的旧视觉模型(`hunyuan-t1-vision-20250916`、`Tencent HY Vision 1.5 Instruct` 等)已于 2026-06-22 下线,新模型(HY-Vision 2.0 等)迁移至[腾讯云 TokenHub](https://cloud.tencent.com/product/tokenhub)。luma 的 `hunyuan` provider 默认端点仍指向旧平台;改用 TokenHub 新模型时,建议以 `custom` provider 接入,将 `CUSTOM_BASE_URL` 设为 `https://tokenhub.tencentmaas.com/v1`。
### Claude Code 快捷命令
```bash
# Zhipu
claude mcp add -s user luma-mcp --env MODEL_PROVIDER=zhipu --env ZHIPU_API_KEY=your-api-key -- npx -y luma-mcp
# SiliconFlow
claude mcp add -s user luma-mcp --env MODEL_PROVIDER=siliconflow --env SILICONFLOW_API_KEY=your-api-key -- npx -y luma-mcp
# Qwen
claude mcp add -s user luma-mcp --env MODEL_PROVIDER=qwen --env DASHSCOPE_API_KEY=your-api-key -- npx -y luma-mcp
# Volcengine
claude mcp add -s user luma-mcp --env MODEL_PROVIDER=volcengine --env VOLCENGINE_API_KEY=your-api-key --env MODEL_NAME=doubao-seed-1-6-vision-250815 -- npx -y luma-mcp
# Hunyuan(新模型在腾讯云 TokenHub,旧混元平台模型已下线)
claude mcp add -s user luma-mcp --env MODEL_PROVIDER=hunyuan --env HUNYUAN_API_KEY=your-api-key --env MODEL_NAME=hy-vision-2.0-instruct -- npx -y luma-mcp
```
### 本地开发模式
指向本地 `build/index.js`(将 `<项目路径>` 替换为你本机的项目绝对路径):
```json
{
"mcpServers": {
"luma": {
"command": "node",
"args": ["<项目路径>/build/index.js"],
"env": {
"MODEL_PROVIDER": "zhipu",
"ZHIPU_API_KEY": "your-api-key"
}
}
}
}
```
若 MCP 客户端支持设置工作目录,也可直接使用相对路径 `build/index.js` 并把 cwd 指向项目根目录。
### HTTP / Docker 部署(局域网共享,v1.7.0+)
默认走 stdio(本地进程)。需要局域网内多个客户端共享一个实例时,改用 **Streamable HTTP** 传输:
```bash
# 本地直接运行(HTTP 模式)
MCP_TRANSPORT=http MCP_HTTP_PORT=3000 MCP_HTTP_TOKEN=your-token node build/index.js
```
Docker 部署:
```bash
docker build -t luma-mcp .
docker run -d --name luma-mcp -p 3000:3000 \
-e MODEL_PROVIDER=zhipu \
-e ZHIPU_API_KEY=your-api-key \
-e MCP_HTTP_TOKEN=your-token \
luma-mcp
```
客户端配置(Claude Desktop / Cline 等支持 URL 方式的客户端):
```json
{
"mcpServers": {
"luma": {
"type": "http",
"url": "http://<服务器IP>:3000/mcp",
"headers": {
"Authorization": "Bearer your-token"
}
}
}
}
```
> [!IMPORTANT]
> **务必设置 `MCP_HTTP_TOKEN`**:HTTP 模式下任何能访问该端口的人都能调用 `image_understand`,消耗你的模型 API 额度。
>
> **图片来源限制**:HTTP 模式下 `image_source` 只支持 HTTP(S) URL 与 Data URI,**本地文件路径不可用**(服务端在远端,读不到客户端文件);Data URI 传入的图片上限约 10MB(受请求体 30MB 限制)。
### Custom Provider(v1.5.0+)
使用任意 OpenAI 兼容端点(OpenAI、OpenRouter、Together AI、Anthropic 代理、本地 vLLM/Ollama 等):
```bash
claude mcp add -s user luma-mcp \
--env MODEL_PROVIDER=custom \
--env CUSTOM_API_KEY=sk-your-key \
--env CUSTOM_BASE_URL=https://your-endpoint.com/v1 \
--env CUSTOM_MODEL_NAME=your-model \
-- npx -y luma-mcp
```
可选配置(都有默认值):
- `CUSTOM_AUTH_HEADER=bearer` — `bearer` / `x-api-key` / `custom`
- `CUSTOM_PATH=/chat/completions` — API 路径
- `CUSTOM_TIMEOUT_MS=60000` — 超时毫秒
- `CUSTOM_THINKING_MODE=disabled` — `disabled` / `openai` / `qwen_extra_body`
- `CUSTOM_AUTH_HEADER_VALUE="X-API-Key: {{key}}"` — 自定义 Header 模板(`{{key}}` 会被替换为 API Key)
## 使用
### `image_understand`
**单一工具**,参数:
| 参数 | 必填 | 说明 |
| ---- | ---- | ---- |
| `image_source` | 是 | 粘贴路径、本地文件路径、HTTP(S) 图片 URL 或 Data URI |
| `prompt` | 是 | 用户对图片的原始问题,无需手写长分析模板 |
| `task_type` | 否 | `auto` \| `general` \| `ocr` \| `ui` \| `debug` \| `describe` |
`task_type` 行为:
- 省略或 `auto`(默认):与旧版一致,按 prompt 启发式路由
- `ocr`:文字提取,默认单图高保真(关闭 multi-crop)
- `ui` / `debug`:界面结构 / 报错截图,倾向文本保真
- `describe`:简短描述
示例:
```typescript
image_understand({
image_source: "./screenshot.png",
prompt: "分析这个页面的布局和主要组件结构",
task_type: "ui",
});
image_understand({
image_source: "./code-error.png",
prompt: "这段代码为什么报错?请给出修复建议",
// task_type 可省略,行为与旧版兼容
});
image_understand({
image_source: "https://example.com/ui.png",
prompt: "找出这个界面的可用性问题",
});
```
### 使用建议
- 非视觉模型需要明确提示调用 MCP 工具
- 代码截图、OCR、长图、表格这类文本密集图片会自动启用更保真的处理方式
- 大图会按配置自动生成原图加裁剪图,提高细节理解能力
- 需要排查耗时/裁剪数时设 `INCLUDE_META=true` 或 `LUMA_DEBUG=1`,结果末尾会附 `luma_meta`
## 环境变量
### 通用配置
| 变量名 | 默认值 | 说明 |
| ------ | ------ | ---- |
| `MODEL_PROVIDER` | `zhipu` | 模型提供商:`zhipu`、`siliconflow`、`qwen`、`volcengine`、`hunyuan`、`custom` |
| `MODEL_NAME` | 自动选择 | 模型名称覆盖 |
| `MAX_TOKENS` | `8192` | 最大生成 token 数(部分模型有硬上限,见下方说明) |
| `TEMPERATURE` | `0.7` | 采样温度 |
| `TOP_P` | `0.95` | 核采样阈值 |
| `ENABLE_THINKING` | `true` | 思考模式,设为 `false` 关闭 |
| `MULTI_CROP` | `true` | 大图多裁剪,设为 `false` 关闭 |
| `MULTI_CROP_MAX_TILES` | `5` | 多裁剪最大图块数(含原图,1–16) |
| `BASE_VISION_PROMPT` | 内置默认值 | 自定义基础视觉提示词(设为空字符串可关闭) |
| `INCLUDE_META` | `false` | 为 `true` 时在工具结果末尾附加预处理/API 耗时等 meta |
| `LUMA_DEBUG` | 关闭 | `1`/`true` 时等同开启 `INCLUDE_META` |
| `MCP_TRANSPORT` | `stdio` | 传输方式:`stdio`(默认)或 `http`(Streamable HTTP) |
| `MCP_HTTP_HOST` | `0.0.0.0` | HTTP 模式监听地址(Docker 内需为 `0.0.0.0`) |
| `MCP_HTTP_PORT` | `3000` | HTTP 模式监听端口 |
| `MCP_HTTP_TOKEN` | 空(不鉴权) | HTTP 模式 Bearer token;**局域网共享务必设置** |
> [!IMPORTANT]
> **关于 Token 限制的特别说明:**
>
> 1. **SiliconFlow (DeepSeek-OCR)**: 该模型的总上下文长度(输入+输出)仅为 **8192**。为了确保图片能正常输入,Luma 已在客户端内部将 `MAX_TOKENS` 硬性限制在 **4096** 以内。即使你在环境变量中设置了更高的值,也会被截断。
> 2. **通用建议**: 视觉理解任务通常不需要极长的输出。对于大多数模型,建议将 `MAX_TOKENS` 保持在 `4096` 或 `8192`。设置过高(如 `16384`)在处理大图时,可能因总长度超过模型上限而导致 `400` 错误。
### 提供商密钥
| 提供商 | 必填环境变量 | 默认模型 |
| ------ | ------------ | -------- |
| Zhipu | `ZHIPU_API_KEY` | `glm-4.6v` |
| SiliconFlow | `SILICONFLOW_API_KEY` | `deepseek-ai/DeepSeek-OCR` |
| Qwen | `DASHSCOPE_API_KEY` | `qwen3-vl-flash` |
| Volcengine | `VOLCENGINE_API_KEY` | `doubao-seed-1-6-flash-250828` |
| Hunyuan | `HUNYUAN_API_KEY` | `hunyuan-t1-vision-20250916` |
## 图片限制与处理
- 支持格式:JPG、PNG、WebP、GIF
- 最大输入大小:10MB(本地文件、远程 URL、Data URI 一致)
- 超过 2MB 的图片会自动压缩
- 最大分辨率:1600 万像素(超出将报错)
- 远程 URL 会先拉取到统一预处理链路再发送给模型,并带 SSRF 防护(拒绝内网/私网地址、禁用重定向)
- 长边 ≥ 1800px 或 ≥ 350 万像素的大图,自动生成原图 + 有序裁剪图(受 `MULTI_CROP` / `MULTI_CROP_MAX_TILES` 控制)
## 本地测试
```bash
# 单元测试(不调用真实 API)
npm run test:unit
# MCP stdio 端到端测试(真实调用 image_understand)
npm run test:mcp
# MCP HTTP 传输测试(无需 API key)
npm run test:http
# 基础测试
npm run test:local ./test.png
# 带问题测试
npm run test:local ./code-error.png "这段代码为什么报错?"
# 远程图片测试
npm run test:local https://example.com/image.jpg
# 检查源码和测试脚本类型
npm run typecheck
```
## 模型选择建议
- OCR、文字识别:DeepSeek-OCR
- 快速低成本通用分析:Qwen3-VL-Flash
- 高性价比通用分析:Doubao-Seed-1.6
- 深度图片理解:GLM-4.6V
- 复杂图文推理、多语言:Hunyuan-Vision(新模型为混元 HY-Vision,见腾讯云 TokenHub)
## 项目结构
```text
luma-mcp/
├── src/
│ ├── index.ts # MCP 服务器入口,注册 image_understand
│ ├── http-server.ts # Streamable HTTP 传输层(鉴权/会话/CORS)
│ ├── config.ts # 环境变量加载与校验
│ ├── constants.ts # 默认视觉提示词等常量
│ ├── task-types.ts # 可选 task_type 路由
│ ├── vision-client.ts # 视觉模型客户端接口
│ ├── openai-compatible-client.ts # OpenAI 兼容请求基类
│ ├── zhipu-client.ts # GLM-4.6V 客户端
│ ├── siliconflow-client.ts # DeepSeek-OCR 客户端
│ ├── qwen-client.ts # Qwen3-VL 客户端
│ ├── volcengine-client.ts # Doubao-Seed-1.6 客户端
│ ├── hunyuan-client.ts # Hunyuan-Vision 客户端
│ ├── custom-client.ts # 任意 OpenAI 兼容端点
│ ├── image-processor.ts # 图片预处理、压缩、多裁剪
│ └── utils/
│ ├── helpers.ts # 重试、响应格式化、错误脱敏
│ └── logger.ts # 日志
├── test/
│ ├── test-local.ts # 本地单图/多图测试
│ ├── test-qwen.ts # Qwen 客户端测试
│ ├── test-deepseek-raw.ts # DeepSeek-OCR 原始调用测试
│ ├── test-data-uri.ts # Data URI 处理测试
│ ├── test-custom.ts # CustomClient 单元测试
│ ├── test-task-types.ts # task_type 路由测试
│ ├── test-mcp-stdio.ts # MCP stdio 端到端测试
│ ├── test-mcp-http.ts # MCP HTTP 传输测试(无需 API key)
│ └── image-processor-regression.ts # 图片处理回归测试
├── Dockerfile # HTTP 模式容器化部署
├── vision-skill/ # 轻量识图 skill(无 MCP 用户的替代方案)
│ ├── SKILL.md # skill 定义:/skill luma-vision 激活
│ └── scripts/vision.js # 零依赖识图脚本,直连视觉模型 API
├── docs/
│ └── README_EN.md
├── build/ # 编译产物
├── package.json
└── tsconfig.json
```
## 开发
```bash
npm run watch
npm run build
npm run typecheck
```
## 相关链接
- [智谱开放平台](https://open.bigmodel.cn/)
- [硅基流动平台](https://cloud.siliconflow.cn/)
- [阿里云百炼](https://bailian.console.aliyun.com/)
- [火山方舟](https://console.volcengine.com/ark)
- [腾讯混元](https://cloud.tencent.com/product/hunyuan)
- [MCP 协议](https://modelcontextprotocol.io/)
## 更新历史
[CHANGELOG.md](./CHANGELOG.md)
## 许可证
MIT
TDQS
Scored across 1 tool
Only one tool exists, so there is no possibility of misselection between tools. The tool's purpose is clearly defined with explicit call conditions and task types.
The server has a single tool named 'image_understand' in snake_case. With only one tool, there is no naming pattern to conflict; the name is descriptive and consistent with a verb-adjacent structure.
The server exposes exactly one tool. While the tool is comprehensive and well-designed, a single tool feels thin for an MCP server per the calibration guidelines, placing it in the borderline category.
The image_understand tool covers a broad range of use cases (general understanding, OCR, UI analysis, debugging, and description) via its task_type parameter. It provides a complete lifecycle for image understanding, with no obvious missing operations within its stated scope.