smart-image-scraper-mcp 2.13.1 → 2.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,40 +1,68 @@
1
- # 全网智能图片抓取 MCP 服务器
1
+ # Smart Image Scraper MCP
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/smart-image-scraper-mcp.svg)](https://www.npmjs.com/package/smart-image-scraper-mcp)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
5
 
6
- 基于 Node.js 和 Model Context Protocol (MCP) 开发的**高性能**智能图片抓取工具。让 AI 客户端(如 Claude Desktop、Windsurf)能够通过自然语言指令,实现全网图片资源的搜索、验证、下载与本地化管理。
6
+ 基于 Node.js 和 Model Context Protocol (MCP) 开发的**全网智能图片抓取工具**。让 AI 客户端(如 Claude Desktop、Windsurf、Cursor)能够通过自然语言指令,实现全网图片资源的搜索、验证、下载与本地化管理。
7
+
8
+ > 🌐 支持 Bing / Google 双搜索引擎 | 🖼️ 三种运行模式 | 📁 自定义保存路径 | 🛡️ 防盗链智能处理
7
9
 
8
10
  ## ✨ 核心特性
9
11
 
10
- ### 🚀 高性能架构 (v2.8.0)
11
- - **多请求并行**:同时处理 5 MCP 请求
12
- - **并行翻页搜索**:同时获取多页结果,速度提升 5x
13
- - **HTTP 连接池**:Keep-Alive 复用 TCP 连接
14
- - **智能缓存**:LRU 缓存减少重复请求
15
- - **请求队列管理**:自动资源释放,防止内存泄漏
16
-
17
- ### 📷 双模式运行
18
- - **`link` 模式**:快速返回图片直链(默认跳过 HTTP 验证)
19
- - **`download` 模式**:下载到本地,自动按质量排序
20
-
21
- ### 🎯 高级功能
22
- - **批量处理**:逗号分隔多关键词批量搜索
23
- - **尺寸过滤**:small/medium/large/wallpaper
24
- - **宽高比过滤**:wide(横屏)/tall(竖屏)/square(正方形)
25
- - **尺寸统一**:下载后自动裁剪/缩放到指定尺寸
26
- - **质量控制**:三种质量模式(fast/balanced/high)
12
+ ### 三种运行模式
13
+ - **`link` 模式**:搜索并返回验证过的图片直链列表,适合只需要 URL 的场景
14
+ - **`download` 模式**:搜索并下载图片到本地,自动按质量排序优先高清
15
+ - **`both` 模式** *(v2.13 新增)*:同时返回链接列表和下载文件,适合需要链接备份的场景
16
+
17
+ ### � 自定义保存路径 *(v2.13 新增)*
18
+ - **`savePath` 参数**:指定图片保存的绝对路径
19
+ - 不指定时默认保存到 MCP 服务器项目下的 `images/` 目录
20
+ - 支持 `download` `both` 模式
21
+
22
+ ### 🛡️ 防盗链智能处理 *(v2.13 新增)*
23
+ - **`filterHotlink` 参数**:控制是否过滤防盗链图片,默认开启
24
+ - 开启时自动过滤无法在浏览器直接打开的防盗链链接
25
+ - 关闭时返回更多结果,下载模式会自动添加 Referer 头绕过防盗链
26
+
27
+ ### 🎯 高级搜索功能
28
+ - **批量处理**:逗号分隔多关键词批量搜索(如 `"猫,狗,鸟"`)
29
+ - **尺寸过滤**:`small` / `medium` / `large` / `wallpaper`
30
+ - **宽高比过滤**:`wide`(横屏)/ `tall`(竖屏)/ `square`(正方形)
31
+ - **尺寸统一**:下载后自动裁剪/缩放到指定尺寸(支持预设如 `desktop_1080p`)
32
+ - **质量控制**:`fast`(跳过验证)/ `balanced`(验证有效性)/ `high`(验证+按质量排序)
27
33
  - **文件大小过滤**:按最小文件大小筛选高质量图片
28
34
 
35
+ ### 🚀 高性能架构
36
+ - **智能缓存**:LRU 缓存减少重复搜索请求
37
+ - **并发控制**:下载/验证并发数可配置,防止资源耗尽
38
+ - **超时保护**:多层超时机制(连接/下载/全局),防止请求挂起
39
+ - **资源自动释放**:每次请求后自动清理,支持长时间连续调用
40
+ - **日志限流**:stderr 输出限流保护,避免高频调用时阻塞 MCP 通信
41
+
29
42
  ## 安装
30
43
 
31
- ### 方式一:npm 全局安装(推荐)
44
+ ### 方式一:npx 直接使用(推荐)
45
+
46
+ 无需安装,在 MCP 客户端配置中直接使用:
47
+
48
+ ```json
49
+ {
50
+ "mcpServers": {
51
+ "smart-image-scraper": {
52
+ "command": "npx",
53
+ "args": ["-y", "smart-image-scraper-mcp"]
54
+ }
55
+ }
56
+ }
57
+ ```
58
+
59
+ ### 方式二:npm 全局安装
32
60
 
33
61
  ```bash
34
62
  npm install -g smart-image-scraper-mcp
35
63
  ```
36
64
 
37
- ### 方式二:本地开发
65
+ ### 方式三:本地开发
38
66
 
39
67
  ```bash
40
68
  git clone https://github.com/your-repo/smart-image-scraper-mcp.git
@@ -46,7 +74,7 @@ npm install
46
74
 
47
75
  ### 1. 配置 MCP 客户端
48
76
 
49
- **Windsurf 配置** (`~/.codeium/windsurf/mcp_config.json`):
77
+ **Windsurf** (`~/.codeium/windsurf/mcp_config.json`):
50
78
 
51
79
  ```json
52
80
  {
@@ -59,7 +87,7 @@ npm install
59
87
  }
60
88
  ```
61
89
 
62
- **Claude Desktop 配置** (`claude_desktop_config.json`):
90
+ **Claude Desktop** (`claude_desktop_config.json`):
63
91
 
64
92
  ```json
65
93
  {
@@ -75,106 +103,114 @@ npm install
75
103
  }
76
104
  ```
77
105
 
106
+ **Cursor** (MCP 设置中添加):
107
+
108
+ ```json
109
+ {
110
+ "mcpServers": {
111
+ "smart-image-scraper": {
112
+ "command": "npx",
113
+ "args": ["-y", "smart-image-scraper-mcp"]
114
+ }
115
+ }
116
+ }
117
+ ```
118
+
78
119
  ### 2. 重启客户端
79
120
 
80
- 配置完成后重启 Windsurf 或 Claude Desktop。
121
+ 配置完成后重启你的 AI 客户端。
81
122
 
82
123
  ### 3. 开始使用
83
124
 
84
- 直接用自然语言描述需求:
85
- - "帮我搜索 10 张猫咪图片"
86
- - "下载 20 张高清风景壁纸"
87
- - "找一些人物头像图片"
125
+ 直接用自然语言描述需求即可:
88
126
 
89
- > ⚠️ **重要限制**:同一会话中连续调用不要超过 5 次!需要多种类型图片时,使用批量查询(逗号分隔关键词)。
127
+ - "帮我搜索 10 张猫咪图片的链接"
128
+ - "下载 5 张高清风景壁纸到 D:/photos"
129
+ - "搜索并下载 3 张日落图片,同时保留链接"
130
+ - "找一些 1080p 的电脑壁纸"
90
131
 
91
- ## Tool Schema
132
+ > ⚠️ **提示**:同一会话中连续调用建议不超过 5 次。需要多种类型图片时,使用批量查询(逗号分隔关键词),如 `"猫,狗,鸟"`。
92
133
 
93
- ### smart_scraper
134
+ ## 参数说明
94
135
 
95
- 全网智能图片抓取工具。
136
+ ### smart_scraper
96
137
 
97
- **输入参数**:
138
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
139
+ |------|------|:----:|--------|------|
140
+ | `query` | string | ✅ | - | 搜索关键词,多个用英文逗号分隔 |
141
+ | `mode` | string | ✅ | - | 运行模式:`link` / `download` / `both` |
142
+ | `count` | number | ❌ | `10` | 每个关键词获取的图片数量(1-100) |
143
+ | `source` | string | ❌ | `bing` | 搜索引擎:`bing` / `google` |
144
+ | `size` | string | ❌ | `all` | 图片尺寸:`all` / `small` / `medium` / `large` / `wallpaper` |
145
+ | `aspect` | string | ❌ | `all` | 宽高比:`all` / `wide` / `tall` / `square` |
146
+ | `quality` | string | ❌ | `balanced` | 质量模式:`fast` / `balanced` / `high` |
147
+ | `minFileSize` | string | ❌ | `any` | 最小文件大小:`any` / `50kb` / `100kb` / `200kb` / `500kb` / `1mb` |
148
+ | `safeSearch` | string | ❌ | `moderate` | 安全搜索:`off` / `moderate` / `strict` |
149
+ | `savePath` | string | ❌ | `images/` | 自定义保存路径(绝对路径),仅 `download` / `both` 模式有效 |
150
+ | `filterHotlink` | boolean | ❌ | `true` | 是否过滤防盗链图片 |
151
+ | `targetSize` | string | ❌ | - | 目标尺寸,如 `1920x1080` 或预设名 `desktop_1080p` |
152
+ | `fit` | string | ❌ | `cover` | 尺寸适应模式:`cover`(裁剪填充)/ `contain`(留白)/ `fill`(拉伸) |
153
+
154
+ ### 预设尺寸名称
155
+
156
+ | 类别 | 预设名 | 尺寸 |
157
+ |------|--------|------|
158
+ | 电脑壁纸 | `desktop_1080p` | 1920×1080 |
159
+ | 电脑壁纸 | `desktop_2k` | 2560×1440 |
160
+ | 电脑壁纸 | `desktop_4k` | 3840×2160 |
161
+ | 手机壁纸 | `mobile_hd` | 1080×1920 |
162
+ | 手机壁纸 | `mobile_2k` | 1440×2560 |
163
+ | 正方形 | `square_1080` | 1080×1080 |
164
+ | 正方形 | `square_512` | 512×512 |
165
+ | 社交媒体 | `instagram` | 1080×1080 |
166
+ | 社交媒体 | `twitter` | 1200×675 |
167
+ | 社交媒体 | `facebook` | 1200×630 |
168
+
169
+ ## 使用示例
170
+
171
+ ### 基础用法
172
+
173
+ ```jsonc
174
+ // 搜索图片链接
175
+ { "query": "可爱的猫咪", "mode": "link", "count": 5 }
176
+
177
+ // 下载图片到本地
178
+ { "query": "风景壁纸", "mode": "download", "count": 10 }
179
+
180
+ // 搜索并下载(同时返回链接和文件)
181
+ { "query": "日落", "mode": "both", "count": 5 }
182
+ ```
98
183
 
99
- | 参数 | 类型 | 必填 | 说明 |
100
- |------|------|------|------|
101
- | `query` | string | ✅ | 搜索关键词,多个关键词用逗号分隔 |
102
- | `mode` | string | ✅ | 运行模式:`link` 或 `download` |
103
- | `count` | number | ❌ | 每个关键词获取的图片数量,默认 10 |
104
- | `source` | string | ❌ | 搜索源,支持 `bing` 和 `google`,默认 `bing` |
105
- | `size` | string | ❌ | 图片尺寸:`all`, `small`, `medium`, `large`, `wallpaper`,默认 `all` |
106
- | `aspect` | string | ❌ | 宽高比:`all`, `wide`, `tall`, `square`,默认 `all` |
107
- | `quality` | string | ❌ | 质量模式:`fast`, `balanced`, `high`,默认 `balanced` |
108
- | `minFileSize` | string | ❌ | 最小文件大小:`any`, `50kb`, `100kb`, `200kb`, `500kb`, `1mb`,默认 `any` |
109
- | `safeSearch` | string | ❌ | 安全搜索:`off`, `moderate`, `strict`,默认 `moderate` |
184
+ ### 自定义保存路径
110
185
 
111
- **使用示例**:
186
+ ```jsonc
187
+ // 下载到指定目录
188
+ { "query": "猫", "mode": "download", "count": 5, "savePath": "D:/my/photos" }
112
189
 
190
+ // both 模式 + 自定义路径
191
+ { "query": "风景", "mode": "both", "count": 5, "savePath": "D:/wallpapers" }
113
192
  ```
114
- // 链接模式 - 获取猫咪图片链接
115
- {
116
- "query": "可爱的猫咪",
117
- "mode": "link",
118
- "count": 5
119
- }
120
193
 
121
- // 下载模式 - 批量下载多种动物图片
122
- {
123
- "query": "猫,狗,鸟",
124
- "mode": "download",
125
- "count": 10
126
- }
194
+ ### 高级用法
127
195
 
128
- // 高级用法 - 使用 Google 搜索大尺寸壁纸
129
- {
130
- "query": "赛博朋克城市",
131
- "mode": "download",
132
- "count": 20,
133
- "source": "google",
134
- "size": "wallpaper",
135
- "safeSearch": "strict"
136
- }
196
+ ```jsonc
197
+ // 批量下载多类图片
198
+ { "query": "猫,狗,兔子", "mode": "download", "count": 5 }
137
199
 
138
- // 高质量模式 - 获取验证过的高清图片
139
- {
140
- "query": "风景",
141
- "mode": "link",
142
- "count": 10,
143
- "size": "large",
144
- "quality": "high",
145
- "minFileSize": "100kb"
146
- }
147
- ```
200
+ // 高质量大图
201
+ { "query": "风景", "mode": "link", "count": 10, "size": "large", "quality": "high", "minFileSize": "100kb" }
148
202
 
149
- ## 架构设计
203
+ // 电脑壁纸(横屏 + 统一尺寸)
204
+ { "query": "自然风光", "mode": "download", "count": 10, "aspect": "wide", "targetSize": "desktop_1080p" }
150
205
 
151
- ```
152
- ┌─────────────────────────────────────────────────────────────────────────┐
153
- │ MCP Server (index.js) │
154
- │ - 版本号从 package.json 动态读取 │
155
- │ - 优雅关闭和资源清理 │
156
- └─────────────────────────────────────────────────────────────────────────┘
157
-
158
- ┌─────────────────────────────────────────────────────────────────────────┐
159
- │ RequestQueue (requestQueue.js) │
160
- │ - 最大并发: 5 个请求 │
161
- │ - 请求超时: 60 秒 │
162
- │ - 队列超时: 30 秒 │
163
- │ - 自动资源释放 │
164
- └─────────────────────────────────────────────────────────────────────────┘
165
-
166
- ┌─────────────────────────────────────────────────────────────────────────┐
167
- │ Orchestrator (orchestrator.js) │
168
- │ - 关键词并发: 3 个/请求 │
169
- │ - 智能缓存集成 │
170
- │ - 快速模式/完整验证模式 │
171
- └─────────────────────────────────────────────────────────────────────────┘
172
-
173
- ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
174
- │ BingScraper │ │ GoogleScraper │ │ LinkValidator │
175
- │ - 并行翻页(5页) │ │ - 并行翻页(5页) │ │ - 并发验证(30) │
176
- │ - 最小延迟 50ms │ │ - 最小延迟 50ms │ │ - 超时 1.5s │
177
- └──────────────────┘ └──────────────────┘ └──────────────────┘
206
+ // 手机壁纸(竖屏)
207
+ { "query": "动漫", "mode": "download", "count": 10, "aspect": "tall", "targetSize": "mobile_hd" }
208
+
209
+ // 关闭防盗链过滤(获取更多结果)
210
+ { "query": "猫咪", "mode": "link", "count": 10, "filterHotlink": false }
211
+
212
+ // Google 搜索 + 安全过滤
213
+ { "query": "赛博朋克城市", "mode": "download", "count": 20, "source": "google", "size": "wallpaper", "safeSearch": "strict" }
178
214
  ```
179
215
 
180
216
  ## 项目结构
@@ -182,136 +218,103 @@ npm install
182
218
  ```
183
219
  smart-image-scraper-mcp/
184
220
  ├── src/
185
- │ ├── index.js # MCP 服务器入口
221
+ │ ├── index.js # MCP 服务器入口 & Tool Schema 定义
186
222
  │ ├── config/
187
- │ │ └── index.js # 配置模块
223
+ │ │ └── index.js # 配置模块(环境变量、默认值)
188
224
  │ ├── infrastructure/
189
- │ │ ├── httpClient.js # HTTP 客户端(连接池)
225
+ │ │ ├── httpClient.js # HTTP 客户端(超时、重试)
190
226
  │ │ ├── requestQueue.js # 请求队列管理
191
227
  │ │ ├── cache.js # LRU 缓存
192
- │ │ ├── metrics.js # 性能指标
228
+ │ │ ├── metrics.js # 性能指标收集
193
229
  │ │ ├── healthCheck.js # 健康检查
194
230
  │ │ ├── gracefulShutdown.js # 优雅关闭
195
231
  │ │ ├── rateLimiter.js # 速率限制
196
- │ │ ├── logger.js # 日志模块
197
- │ │ ├── retry.js # 重试机制
198
- │ │ ├── errors.js # 错误分类
232
+ │ │ ├── logger.js # 日志模块(限流保护)
233
+ │ │ ├── retry.js # 指数退避重试
234
+ │ │ ├── errors.js # 错误分类体系
199
235
  │ │ └── proxy.js # 代理支持
200
236
  │ ├── providers/
201
- │ │ ├── baseScraper.js # 抽象基类
202
- │ │ ├── bingScraper.js # Bing 搜索(并行翻页)
203
- │ │ ├── googleScraper.js # Google 搜索(并行翻页)
204
- │ │ └── index.js # 提供者索引
237
+ │ │ ├── baseScraper.js # 搜索引擎抽象基类
238
+ │ │ ├── bingScraper.js # Bing 图片搜索
239
+ │ │ ├── googleScraper.js # Google 图片搜索
240
+ │ │ └── index.js # 搜索引擎工厂
205
241
  │ └── services/
206
- │ ├── orchestrator.js # 任务编排器
207
- │ ├── linkValidator.js # 链接验证器
208
- │ ├── fileManager.js # 文件管理器
209
- │ ├── imageProcessor.js # 图片处理器
242
+ │ ├── orchestrator.js # 任务编排器(核心调度)
243
+ │ ├── linkValidator.js # 链接验证 & 防盗链检测
244
+ │ ├── fileManager.js # 文件下载 & 存储管理
245
+ │ ├── imageProcessor.js # 图片裁剪/缩放处理
210
246
  │ └── index.js # 服务索引
211
- ├── images/ # 图片存储目录
247
+ ├── images/ # 默认图片存储目录
212
248
  ├── package.json
249
+ ├── LICENSE
213
250
  └── README.md
214
251
  ```
215
252
 
216
253
  ## 技术栈
217
254
 
218
- - **Runtime**: Node.js >= 18.x
219
- - **MCP SDK**: @modelcontextprotocol/sdk
220
- - **HTTP Client**: axios
221
- - **HTML Parser**: cheerio
222
- - **Concurrency**: p-limit
223
- - **File System**: fs-extra
224
-
225
- ## 生产级功能
226
-
227
- ### 🔄 请求队列管理
228
- - 最大并发 5 个请求
229
- - 队列最大 20 个等待
230
- - 请求超时 60 秒
231
- - 队列等待超时 30 秒
232
- - 自动资源释放
233
-
234
- ### 📊 性能指标
235
- - 请求成功率统计
236
- - 缓存命中率统计
237
- - 响应时间统计(平均值、P95)
238
- - 错误分类统计
239
-
240
- ### 💾 智能缓存
241
- - LRU 缓存实现
242
- - 搜索结果缓存(5分钟 TTL)
243
- - 统一缓存键策略
244
- - 自动过期清理
245
-
246
- ### ⚡ 高性能优化
247
- - HTTP 连接池(Keep-Alive)
248
- - 并行翻页搜索(5页同时)
249
- - 极速验证(1.5秒超时)
250
- - 最小请求延迟(50ms)
251
-
252
- ### 🛡️ 错误处理
253
- - 统一错误码体系
254
- - 错误分类(网络/搜索/下载/验证)
255
- - 自动重试机制(指数退避)
256
-
257
- ### 🔒 优雅关闭
258
- - 信号处理(SIGINT/SIGTERM)
259
- - 活跃操作追踪
260
- - 资源清理
255
+ | 技术 | 用途 |
256
+ |------|------|
257
+ | Node.js >= 18.x | 运行时 |
258
+ | @modelcontextprotocol/sdk | MCP 协议通信 |
259
+ | axios | HTTP 请求 |
260
+ | cheerio | HTML 解析 |
261
+ | p-limit | 并发控制 |
262
+ | fs-extra | 文件系统操作 |
263
+ | sharp *(可选)* | 图片尺寸处理 |
264
+ | uuid | 唯一文件名生成 |
261
265
 
262
266
  ## 环境变量配置
263
267
 
264
268
  | 变量名 | 说明 | 默认值 |
265
269
  |--------|------|--------|
266
270
  | `SAVE_ROOT` | 图片下载根目录 | `./images` |
267
- | `LOG_LEVEL` | 日志级别 (DEBUG/INFO/WARN/ERROR) | `INFO` |
271
+ | `LOG_LEVEL` | 日志级别 (`DEBUG` / `INFO` / `WARN` / `ERROR`) | `WARN` |
268
272
  | `LOG_FILE` | 日志文件路径 | 无 |
269
- | `LOG_FORMAT` | 日志格式 (json/text) | `text` |
270
- | `MAX_KEYWORD_CONCURRENCY` | 关键词并发数 | `2` |
271
- | `MAX_DOWNLOAD_CONCURRENCY` | 下载并发数 | `5` |
273
+ | `LOG_FORMAT` | 日志格式 (`json` / `text`) | `text` |
274
+ | `MAX_DOWNLOAD_CONCURRENCY` | 下载并发数 | `10` |
272
275
  | `MAX_VALIDATE_CONCURRENCY` | 验证并发数 | `10` |
273
- | `GLOBAL_TIMEOUT` | 全局超时(毫秒) | `300000` |
274
- | `HTTP_PROXY` / `HTTPS_PROXY` | 代理服务器 | 无 |
275
-
276
- ## 运行测试
277
-
278
- ```bash
279
- npm test
280
- ```
276
+ | `HTTP_PROXY` / `HTTPS_PROXY` | 代理服务器地址 | |
281
277
 
282
278
  ## 版本历史
283
279
 
284
280
  | 版本 | 日期 | 主要更新 |
285
281
  |------|------|----------|
286
- | 2.8.0 | 2026-02 | 添加熔断机制:30秒全局超时、快速失败返回、降低搜索超时至8秒 |
287
- | 2.7.0 | 2026-02 | 新增质量控制:quality 参数(fast/balanced/high)、minFileSize 文件大小过滤 |
288
- | 2.4.0 | 2026-02 | 修复所有分析问题:超时策略统一、缓存键一致、版本号动态读取 |
289
- | 2.3.0 | 2026-02 | 性能优化:HTTP 连接池、并行翻页搜索、内存泄漏修复 |
290
- | 2.2.0 | 2026-02 | 请求队列管理系统、自动资源释放 |
291
- | 2.1.0 | 2026-02 | 极速模式、快速验证、更高并发 |
292
- | 2.0.0 | 2026-02 | 高性能并发模型、多请求并行 |
293
- | 1.0.0 | 2026-01 | 初始版本 |
294
-
295
- ## 注意事项
296
-
297
- 1. 请遵守目标网站的使用条款和 robots.txt
298
- 2. 建议适度使用,避免频繁请求
299
- 3. 下载的图片仅供个人学习使用
300
- 4. 首次请求可能较慢(需要建立连接池)
282
+ | **2.13.x** | 2026-02 | **新增 `both` 模式**(同时返回链接+下载文件)、**自定义保存路径** `savePath`、**防盗链过滤开关** `filterHotlink`;stderr 日志限流优化 |
283
+ | 2.12.x | 2026-02 | 🛡️ 防盗链检测与过滤、连续调用稳定性修复(stderr 限流、资源释放、超时加固) |
284
+ | 2.11.x | 2026-02 | 🔧 AbortSignal 传播修复、下载超时加固、HTTP keepAlive 关闭 |
285
+ | 2.8.0 | 2026-02 | 熔断机制:全局超时、快速失败返回 |
286
+ | 2.7.0 | 2026-02 | 🎯 质量控制:`quality` 参数、`minFileSize` 文件大小过滤 |
287
+ | 2.4.0 | 2026-02 | 🔄 超时策略统一、缓存键一致、版本号动态读取 |
288
+ | 2.3.0 | 2026-02 | 🚀 HTTP 连接池、并行翻页搜索、内存泄漏修复 |
289
+ | 2.0.0 | 2026-02 | 🏗️ 高性能并发模型重构 |
290
+ | 1.0.0 | 2026-01 | 🎉 初始版本 |
301
291
 
302
292
  ## 常见问题
303
293
 
304
294
  ### Q: 搜索返回 0 张图片?
305
- A: 检查网络连接,或尝试更换搜索源(bing → google
295
+ **A:** 检查网络连接,或尝试更换搜索源(`bing``google`)。部分关键词在特定搜索引擎上结果较少。
306
296
 
307
297
  ### Q: 下载速度慢?
308
- A: 可以设置 `HTTP_PROXY` 环境变量使用代理
298
+ **A:** 可以设置 `HTTP_PROXY` 环境变量使用代理,或使用 `quality: "fast"` 跳过验证步骤。
299
+
300
+ ### Q: 连续调用多次后无响应?
301
+ **A:** 建议:
302
+ 1. 使用**批量查询**:`"猫,狗,鸟"` 一次获取多个关键词
303
+ 2. 单次会话中调用不超过 **5 次**
304
+ 3. 如遇卡住,重启 MCP 服务器即可恢复
305
+
306
+ ### Q: 下载的图片打不开?
307
+ **A:** 部分网站有防盗链保护。可以尝试设置 `filterHotlink: false` 获取更多源,或使用 `quality: "balanced"` 以上模式自动验证图片有效性。
308
+
309
+ ### Q: 如何保存到指定目录?
310
+ **A:** 使用 `savePath` 参数指定绝对路径,如 `"savePath": "D:/my/photos"`。仅在 `download` 和 `both` 模式下生效。
309
311
 
310
- ### Q: Windsurf 中连续调用多次后卡住?
311
- A: 这是 Windsurf MCP 客户端的已知限制。建议:
312
- 1. **使用批量查询**:`"skiing,ice skating,snowmobile"` 一次获取多个关键词
313
- 2. **开新会话**:每3次调用后开一个新的聊天会话
314
- 3. 等待 Windsurf 官方修复
312
+ ## 注意事项
313
+
314
+ 1. 请遵守目标网站的使用条款和 robots.txt
315
+ 2. 建议适度使用,避免短时间内大量请求
316
+ 3. 下载的图片版权归原作者所有,仅供个人学习研究使用
317
+ 4. 首次运行时 npx 需要下载依赖,可能需要等待几秒
315
318
 
316
319
  ## License
317
320
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "smart-image-scraper-mcp",
3
- "version": "2.13.1",
4
- "description": "全网智能图片抓取 MCP 服务器 - 支持 Bing/Google 图片搜索、验证和下载",
3
+ "version": "2.13.3",
4
+ "description": "全网智能图片抓取 MCP 服务器 - 支持 Bing/Google 搜索、三种模式(link/download/both)、自定义保存路径、防盗链处理、质量控制、尺寸统一",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
7
7
  "bin": {
@@ -17,10 +17,16 @@
17
17
  "mcp",
18
18
  "model-context-protocol",
19
19
  "image-scraper",
20
+ "image-downloader",
20
21
  "bing-images",
21
22
  "google-images",
22
23
  "ai-tools",
23
- "claude"
24
+ "claude",
25
+ "windsurf",
26
+ "cursor",
27
+ "mcp-server",
28
+ "image-search",
29
+ "batch-download"
24
30
  ],
25
31
  "author": "",
26
32
  "license": "MIT",
@@ -138,19 +138,17 @@ class Logger {
138
138
 
139
139
  const formatted = this._format(level, message, data);
140
140
 
141
- // 输出到 stderr(带限流:每秒最多 20 条,防止高频调用时 stderr 缓冲区堆积阻塞事件循环)
142
- if (level >= LogLevel.WARN) {
141
+ // 输出到 stderr(带限流:每秒最多 5 ERROR 级别,防止 stderr 缓冲区堆积阻塞事件循环)
142
+ if (level >= LogLevel.ERROR) {
143
143
  const now = Date.now();
144
144
  if (now - this._stderrWindowStart > 1000) {
145
- // 新的1秒窗口
146
145
  this._stderrWindowStart = now;
147
146
  this._stderrWindowCount = 0;
148
147
  }
149
- if (this._stderrWindowCount < 20) {
148
+ if (this._stderrWindowCount < 5) {
150
149
  this._stderrWindowCount++;
151
150
  process.stderr.write(formatted + '\n');
152
151
  }
153
- // 超出限流的日志静默丢弃,不阻塞
154
152
  }
155
153
 
156
154
  // 输出到文件(异步写入,避免阻塞事件循环)