Skip to main content
Glama
README.md
# readpic-mcp

一个 MCP(Model Context Protocol)服务,把图片交给视觉模型分析、返回详细的中文文本描述,让**不支持多模态的文本模型**也能"看懂"图片。专为软件开发场景设计(截图、UI 设计稿、错误日志、架构图等)。



## 安装

**环境要求**:Node.js 18+

```bash
# 1. 克隆仓库
git clone git@github.com:Alzeros/readpic-mcp.git
cd readpic-mcp

# 2. 一键安装(安装依赖 → 复制配置模板 → 打印 MCP 配置)
node setup.js

# 3. 编辑配置,填入你的 API 信息
# 用编辑器打开 config.json,修改 api_base_url 和 api_key
```

安装完成后,将 `setup.js` 打印的 MCP 配置粘贴到你的 AI 客户端(CodeBuddy/Cursor 等)即可使用。

## 配置

复制 `config.example.json` 为 `config.json`,填入自建 API 站地址与密钥:

```json
{
  "api_base_url": "https://your-api-server.com/v1/chat/completions",
  "api_key": "your-api-key",
  "model_name": "auto-vl",
  "default_prompt": "",
  "timeout_ms": 30000,
  "max_retries": 2,
  "retry_backoff_ms": 500,
  "max_image_bytes": 5242880,
  "max_image_long_edge": 1568,
  "log_level": "info"
}
```

**配置查找顺序**(取第一个存在的):
1. 环境变量 `READPIC_CONFIG_PATH` 指定的路径
2. 可执行文件(`dist/index.js`)同目录的 `config.json`
3. 进程 cwd 下的 `config.json`
4. `~/.readpic/config.json`

> `config.json` 已加入 `.gitignore`。代码容忍 UTF-8 BOM,Windows 编辑器加 BOM 也不影响。

### 配置项

| 字段 | 说明 | 默认值 |
|------|------|--------|
| `api_base_url` | API 服务站完整请求地址(OpenAI 兼容) | — |
| `api_key` | 认证密钥 | — |
| `model_name` | 视觉模型名称 | `auto-vl` |
| `default_prompt` | 默认分析提示词;留空则用内置(软件开发场景) | 内置提示词 |
| `timeout_ms` | HTTP 请求超时(毫秒) | 30000 |
| `max_retries` | API 失败重试次数 | 2 |
| `retry_backoff_ms` | 重试退避基数,第 n 次等待 `base * 2^(n-1)` | 500 |
| `max_image_bytes` | 单图原始体积上限(字节),超出触发缩放 | 5242880 |
| `max_image_long_edge` | 等比缩放长边像素上限 | 1568 |
| `max_tokens` | 模型最大输出 token 数 | 4096 |
| `log_level` | 日志级别 `debug/info/warn/error` | `info` |

## 在 CodeBuddy 中注册

设置 → MCP → Add MCP,填入:

```json
{
  "mcpServers": {
    "readpic": {
      "type": "stdio",
      "command": "node",
      "args": ["/path/to/mcp-tool/dist/index.js"],
      "description": "图片识读工具 - 将截图/图片转为详细文本描述"
    }
  }
}
```

运行 `node setup.js` 会自动打印好带本机路径的配置,直接复制粘贴即可。

## 工具:`read_picture`

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `image_source` | string | 否 | 本地文件路径或图片 URL;为空读取系统剪贴板 |
| `prompt` | string | 否 | 自定义分析提示词;为空用默认提示词 |

**返回**:图片内容的详细中文文本描述(Markdown 分节,与默认提示词的 6 个分节对齐)。

## 实现说明

- **图片来源**:URL 由 MCP 端下载后转 base64(不依赖 API 站拉取,兼容内网/鉴权图);本地文件、剪贴板同样转 data URI,请求体结构统一。
- **缩放**:用 `sharp` 等比缩放到长边 ≤ `max_image_long_edge`;GIF 取首帧转 PNG;缩放后仍超 `max_image_bytes` 则报错不发送。
- **剪贴板**:Windows 用 PowerShell(STA 模式 `System.Windows.Forms.Clipboard`);macOS 用 `pngpaste`;Linux 用 `xclip`。(未使用 `clipboard-image`,避免不维护的依赖。)
- **API 重试**:仅对网络错误 / 5xx / 429 重试(指数退避),4xx(除 429)不重试;错误消息报告**实际**重试次数。
- **日志**:全部写 **stderr**(MCP 协议占用 stdout),用 `READPIC_LOG_LEVEL` 环境变量覆盖级别。

## 项目结构

```
mcp-tool/
├── src/
│   ├── index.ts          # MCP Server 入口,注册 read_picture
│   ├── config.ts         # 配置加载(查找路径 + BOM 容忍 + 校验)
│   ├── logger.ts         # 日志(stderr)
│   ├── api-client.ts     # OpenAI 兼容请求 + 重试
│   └── image-loader.ts   # 文件/URL/剪贴板 -> base64 + sharp 缩放
├── config.example.json   # 配置模板
├── package.json
├── tsconfig.json
└── README.md
```