deepseek-mcp-image
by Chuyuxuan0v0
README.md
# deepseek-mcp-image
中文 | [English](README.en.md)
## 致谢
本地图片的公网分发使用了 [Mini Tools Image API](https://mini-tools.uk/image-api?lang=zh-CN)。
感谢开源作者 [knsjd25](https://github.com/knsjd25) 提供的 [mini-tools.uk](https://github.com/knsjd25/mini-tools.uk) 图床服务。
给 **DeepSeek 等纯文本模型** 用的识图 MCP 服务器:让不支持图片输入的 LLM 也能看图。
主模型调用 `describe_image` 工具并传入**本地图片路径**或 **http(s) URL**。
公网 URL 校验后直接交给商汤;本地路径会先上传到
[Mini Tools 图床](https://mini-tools.uk/image-api?lang=zh-CN),再用返回的公开链接调用
**SenseNova 6.8 Flash-Lite**(`sensenova-6.8-flash-lite`)识别,返回文字描述。
## 工作原理
商汤只接受公网可访问的图片 URL。因此 MCP 会按来源分流:已经是公网地址的直接转发;本地图片则先上传图床,再把公开链接交给商汤。
```mermaid
flowchart TD
Host["纯文本主模型<br/>DeepSeek / Claude / Cursor 等"] -->|"调用 describe_image"| MCP["MCP 服务器<br/>deepseek-mcp-image"]
MCP --> Src{"图片来源?"}
Src -->|"http(s) 公网 URL"| Check["校验:协议、非内网、大小与格式"]
Check --> PubURL["使用原始公开 URL"]
Src -->|"本地路径 / file:// / data:image"| Read["读取并校验图片"]
Read --> Upload["上传 Mini Tools 图床"]
Upload --> Hosted["得到公开 URL"]
PubURL --> Sense["调用商汤 SenseNova<br/>6.8 Flash-Lite"]
Hosted --> Sense
Sense --> Out["返回 Extracted Text<br/>Visual Context<br/>可选 Answer"]
Out --> Host
```
## 环境要求
- Node.js ≥ 18
- 商汤开放平台 API Key(见下方 [申请商汤 API Key](#申请商汤-api-key))
- 若要识别**本地图片**,还需 Mini Tools 图床的用户 ID 和 API Key(见 [申请图床账号和 API Key](#申请图床账号和-api-key))
## 安装
推荐用 npm / npx,无需 clone:
```bash
npm install -g deepseek-mcp-image
```
或每次由 MCP 客户端自动拉取:`npx -y deepseek-mcp-image`。
开发者仍可从源码安装:
```bash
git clone https://github.com/Chuyuxuan0v0/deepseek-mcp-image.git
cd deepseek-mcp-image
npm install
```
## 申请商汤 API Key
识图调用走 [SenseNova 开放平台](https://platform.sensenova.cn/)。官方接入说明见 [注册账号与获取 API Key](https://github.com/OpenSenseNova/SenseNova6.7/blob/main/API_CN.md#1-注册账号与获取-api-key)。
1. 打开 [控制台](https://platform.sensenova.cn/console) 或 [登录页](https://platform.sensenova.cn/login),完成注册(常用手机号 + 短信验证码)与实名认证。免费 token 套餐见 [Token Plan](https://platform.sensenova.cn/token-plan)。
2. 进入控制台左侧:**管理中心 → API-Key 管理 → 创建 API-Key**。
3. 创建成功后**立刻复制**完整 Key(一般以 `sk-` 开头)。它只在创建时显示一次;泄漏了就在同一页删除或禁用,再新建一把。
4. 本项目默认 API 地址是 `https://token.sensenova.cn/v1`,模型为 `sensenova-6.8-flash-lite`。把 Key 写进本机 `.env` 的 `SENSENOVA_API_KEY`,不要提交仓库。
## 申请图床账号和 API Key
本地图片必须先变成公网 URL,本项目使用 [Mini Tools Image API](https://mini-tools.uk/image-api?lang=zh-CN)。网页可以匿名上传,但 MCP 走的是服务端 API,需要管理员分配的账号。
1. 打开 [图片上传 API 文档](https://mini-tools.uk/image-api?lang=zh-CN),按文档说明申请。申请方式与长期存储相同:**发邮件给管理员**。
2. 联系邮箱见官方仓库与文档:[admin@mini-tools.uk](mailto:admin@mini-tools.uk)(也可从 [联系页面](https://mini-tools.uk/contact?lang=zh-CN) 选择对应邮箱)。说明用途即可,例如「用于开源 MCP 识图,把本地图片上传成公开链接」。
3. 管理员核验申请邮箱后才会启用凭证,并回信给你两样东西:
- **用户 ID**(请求头 `X-API-User-ID`)
- **API Key**(请求头 `Authorization: Bearer …`,一般以 `mtu_live_` 开头)
4. 两样都要,缺一不可。只把它们写进本机 `.env`,不要写进代码、不要提交 Git、不要再通过邮件把 Key 发回去。
拿到凭证后,复制 `.env.example` 为 `.env`:
```env
SENSENOVA_API_KEY=sk-你的商汤key
X-API-User-ID=管理员分配的用户ID
Authorization=Bearer mtu_live_你的图床key
```
也可用 `MINI_TOOLS_USER_ID` / `MINI_TOOLS_API_KEY` 这一对变量名。
## 配置环境变量
| 变量 | 必填 | 默认 | 说明 |
|---|---|---|---|
| `SENSENOVA_API_KEY` | ✅ | — | 商汤 API Key |
| `SENSENOVA_BASE_URL` | — | `https://token.sensenova.cn/v1` | API 基础地址 |
| `MINI_TOOLS_USER_ID` | 本地路径时 ✅ | — | Mini Tools 图床用户 ID(也可用 `X-API-User-ID`) |
| `MINI_TOOLS_API_KEY` | 本地路径时 ✅ | — | Mini Tools 图床 API Key(也可用 `Authorization=Bearer …`) |
| `MINI_TOOLS_DURATION` | — | `1-day` | 图床保留期:`1-day` / `7-day` / `30-day` / `permanent` |
| `MAX_IMAGE_BYTES` | — | `20971520`(20MB) | 远程 URL 单张大小上限;图床上传另有 5MB 限制 |
也可复制 `.env.example` 为当前工作目录的 `.env`(已被 git 忽略)。服务器会先读工作目录的 `.env`,再读安装目录里的 `.env`;**MCP 客户端传入的 `env` 优先**。用 npx 时请把密钥写在客户端配置里,不要依赖仓库里的 `.env`。
图床凭证**仅供个人使用**,不要写进代码、不要提交仓库、不要公开。
PowerShell(Windows)示例:
```powershell
$env:SENSENOVA_API_KEY = "sk-你的key"
$env:MINI_TOOLS_USER_ID = "你的图床用户ID"
$env:MINI_TOOLS_API_KEY = "你的图床API Key"
```
## 运行测试
```bash
npm test
```
## 查看当前账号有多少图片
图床 API 不允许浏览器从本地 HTML 直接跨域调用,所以仓库提供了本机相册页:由 `gallery-server.mjs` 读取 `.env`,再去拉 [用量](https://mini-tools.uk/image-api?lang=zh-CN) 和仍有效的图片列表。
```bash
npx deepseek-mcp-image-gallery
```
或在源码目录:`npm run gallery`。
浏览器打开 [http://127.0.0.1:3780](http://127.0.0.1:3780)(不要双击 `gallery.html`)。效果如下:

页面上可以:
- 看顶部 **FRAME COUNTER**:已用 / 总额度(例如 `10 / 100`),以及下次重置时间
- 浏览当前账号**仍有效**的图片缩略图、大小、上传时间
- **复制链接**、**新窗口**打开公开 URL
- **删除**某张图(删除**不会**返还每日额度或永久额度)
按 `Ctrl+C` 结束本机服务。改端口可用环境变量 `GALLERY_PORT`。
## 接入 MCP 客户端
标准 stdio MCP 服务器。推荐用 npx,不必写本机路径:
```json
{
"mcpServers": {
"deepseek-mcp-image": {
"command": "npx",
"args": ["-y", "deepseek-mcp-image"],
"env": {
"SENSENOVA_API_KEY": "sk-你的key",
"MINI_TOOLS_USER_ID": "你的图床用户ID",
"MINI_TOOLS_API_KEY": "你的图床API Key"
}
}
}
}
```
已全局安装时,也可 `"command": "deepseek-mcp-image"`(Windows 上 npm 会生成 `.cmd`)。从源码调试则用:`node <本仓库路径>/src/index.js`。
Claude Desktop 把上面这段写入 `claude_desktop_config.json`;Cursor 写入 MCP 设置即可。
### DeepSeek Harness(dsh)
在 profile 补丁层(如 `~/.dsh/profiles/web/cordis.patch.yml`)追加一行:
```yaml
- insert:
- id: mcp-vision
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: vision
transport: stdio
command: npx
args: ['-y', 'deepseek-mcp-image']
env:
SENSENOVA_API_KEY: !!js process.env.SENSENOVA_API_KEY ?? ''
MINI_TOOLS_USER_ID: !!js process.env.MINI_TOOLS_USER_ID ?? ''
MINI_TOOLS_API_KEY: !!js process.env.MINI_TOOLS_API_KEY ?? ''
failOnStartupError: false
```
重启 dsh 后,主模型即可看到 `mcp__vision__describe_image` 工具(图片支持本地路径或 URL)。
### 其他客户端
Reasonix / Cursor / 通用 MCP 客户端按各自 stdio 服务器配置方式接入即可。
## 工具说明
### describe_image
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
| `image` | string | ✅ | — | 本地图片路径、`file://`、`data:image`,或模型可访问的 `http(s)://` 图片 URL |
| `question` | string | — | — | 要问图片的问题。省略时只做文字提取与视觉描述,不生成 Answer 分区。 |
| `max_tokens` | integer | — | `2000` | 最大生成 token 数,上限 8192 |
支持的图片格式:PNG / JPEG / GIF / WebP / BMP / SVG。本地上传图床时仅支持 JPEG / PNG / GIF / WebP(图床限制)。
### 输出格式
模型按以下分区返回结果:
- `--- Extracted Text ---`:图片中所有文字/符号的逐字转录(代码块、表格等保留格式)
- `--- Visual Context ---`:非文字视觉内容的描述(纯文字截图可能省略此区)
- `--- Answer ---`:仅当传入 `question` 时出现,为对该问题的回答
## 手动验收
设置好 `SENSENOVA_API_KEY` 后,用 SDK 客户端脚本调用一次:
```bash
cd deepseek-mcp-image && node --input-type=module -e "
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
const transport = new StdioClientTransport({
command: process.execPath,
args: ['src/index.js'],
env: { ...process.env, SENSENOVA_API_KEY: process.env.SENSENOVA_API_KEY },
});
const client = new Client({ name: 'manual', version: '0.0.1' });
await client.connect(transport);
const r = await client.callTool({ name: 'describe_image', arguments: { image: 'https://www.sensenova.cn/images/logo.png' } });
console.log(JSON.stringify(r, null, 2));
await client.close();
"
```
预期输出:`isError` 为 `false`,`content[0].text` 为图片的文字描述。
## 限制
- 商汤接口要求图片为模型可访问的 `http(s)` URL。公网 URL 直接转发;本地路径需配置 Mini Tools 图床凭证后自动上传。
- 远程图片单张上限默认 20MB(`MAX_IMAGE_BYTES` 可调);图床单张上限 5MB。
- 不缓存 API 结果;每次调用都会消耗商汤 API 额度,本地图片还会消耗图床额度。
- `finish_reason = content_filter` 时返回合规拦截提示(可能命中商汤内容审核)。
## License
[MIT](LICENSE)
TDQS
A4.3/5.0
Scored across 1 tool
Disambiguation5/5
Only one tool exists, so there is no possibility of confusing it with another tool. Its purpose is clearly defined as image description.
Naming Consistency5/5
The tool name 'describe_image' follows a clear verb_noun pattern and accurately reflects its function.
Tool Count5/5
The server is intentionally scoped to a single capability (image description), so one tool is the appropriate and complete set for its purpose.
Completeness5/5
The tool covers the entire domain it claims to serve: reading images from paths or URLs and returning descriptions. No additional operations are needed for this specific purpose.
Maintenance
ActivityMaintained
ResponsivenessResponsive