web-fetcher-mcp 1.0.10 → 1.0.14

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.
Files changed (85) hide show
  1. package/README.md +312 -98
  2. package/dist/index.js +649 -6
  3. package/dist/index.js.map +1 -1
  4. package/dist/tools/click-element.d.ts +1 -1
  5. package/dist/tools/click-element.d.ts.map +1 -1
  6. package/dist/tools/click-element.js +219 -4
  7. package/dist/tools/click-element.js.map +1 -1
  8. package/dist/tools/execute-js.d.ts +16 -0
  9. package/dist/tools/execute-js.d.ts.map +1 -0
  10. package/dist/tools/execute-js.js +79 -0
  11. package/dist/tools/execute-js.js.map +1 -0
  12. package/dist/tools/get-console-logs.d.ts +6 -0
  13. package/dist/tools/get-console-logs.d.ts.map +1 -0
  14. package/dist/tools/get-console-logs.js +85 -0
  15. package/dist/tools/get-console-logs.js.map +1 -0
  16. package/dist/tools/get-element-attributes.d.ts +10 -0
  17. package/dist/tools/get-element-attributes.d.ts.map +1 -0
  18. package/dist/tools/get-element-attributes.js +90 -0
  19. package/dist/tools/get-element-attributes.js.map +1 -0
  20. package/dist/tools/get-page-info.d.ts +14 -0
  21. package/dist/tools/get-page-info.d.ts.map +1 -0
  22. package/dist/tools/get-page-info.js +163 -0
  23. package/dist/tools/get-page-info.js.map +1 -0
  24. package/dist/tools/hover-element.d.ts +9 -0
  25. package/dist/tools/hover-element.d.ts.map +1 -0
  26. package/dist/tools/hover-element.js +90 -0
  27. package/dist/tools/hover-element.js.map +1 -0
  28. package/dist/tools/list-tabs.d.ts +6 -0
  29. package/dist/tools/list-tabs.d.ts.map +1 -0
  30. package/dist/tools/list-tabs.js +28 -0
  31. package/dist/tools/list-tabs.js.map +1 -0
  32. package/dist/tools/navigate-history.d.ts +8 -0
  33. package/dist/tools/navigate-history.d.ts.map +1 -0
  34. package/dist/tools/navigate-history.js +45 -0
  35. package/dist/tools/navigate-history.js.map +1 -0
  36. package/dist/tools/open-devtools.d.ts +18 -0
  37. package/dist/tools/open-devtools.d.ts.map +1 -0
  38. package/dist/tools/open-devtools.js +64 -0
  39. package/dist/tools/open-devtools.js.map +1 -0
  40. package/dist/tools/scroll-page.d.ts +11 -0
  41. package/dist/tools/scroll-page.d.ts.map +1 -0
  42. package/dist/tools/scroll-page.js +85 -0
  43. package/dist/tools/scroll-page.js.map +1 -0
  44. package/dist/tools/select-option.d.ts +12 -0
  45. package/dist/tools/select-option.d.ts.map +1 -0
  46. package/dist/tools/select-option.js +197 -0
  47. package/dist/tools/select-option.js.map +1 -0
  48. package/dist/tools/tab-manager.d.ts +10 -0
  49. package/dist/tools/tab-manager.d.ts.map +1 -0
  50. package/dist/tools/tab-manager.js +31 -0
  51. package/dist/tools/tab-manager.js.map +1 -0
  52. package/dist/tools/upload-file.d.ts +10 -0
  53. package/dist/tools/upload-file.d.ts.map +1 -0
  54. package/dist/tools/upload-file.js +99 -0
  55. package/dist/tools/upload-file.js.map +1 -0
  56. package/dist/tools/wait-for-element.d.ts +11 -0
  57. package/dist/tools/wait-for-element.d.ts.map +1 -0
  58. package/dist/tools/wait-for-element.js +68 -0
  59. package/dist/tools/wait-for-element.js.map +1 -0
  60. package/dist/tools/web-page-fetcher.d.ts +1 -1
  61. package/dist/tools/web-page-fetcher.d.ts.map +1 -1
  62. package/dist/tools/web-page-fetcher.js +10 -6
  63. package/dist/tools/web-page-fetcher.js.map +1 -1
  64. package/dist/types/index.d.ts +135 -0
  65. package/dist/types/index.d.ts.map +1 -1
  66. package/dist/utils/browser.d.ts +16 -0
  67. package/dist/utils/browser.d.ts.map +1 -1
  68. package/dist/utils/browser.js +22 -20
  69. package/dist/utils/browser.js.map +1 -1
  70. package/dist/utils/console-logger.d.ts +27 -0
  71. package/dist/utils/console-logger.d.ts.map +1 -0
  72. package/dist/utils/console-logger.js +274 -0
  73. package/dist/utils/console-logger.js.map +1 -0
  74. package/dist/utils/html-skeleton.d.ts +6 -0
  75. package/dist/utils/html-skeleton.d.ts.map +1 -0
  76. package/dist/utils/html-skeleton.js +63 -0
  77. package/dist/utils/html-skeleton.js.map +1 -0
  78. package/dist/utils/page-content.d.ts.map +1 -1
  79. package/dist/utils/page-content.js +9 -55
  80. package/dist/utils/page-content.js.map +1 -1
  81. package/dist/utils/tabs.d.ts +55 -0
  82. package/dist/utils/tabs.d.ts.map +1 -0
  83. package/dist/utils/tabs.js +173 -0
  84. package/dist/utils/tabs.js.map +1 -0
  85. package/package.json +1 -1
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  一个通用的 MCP 工具,可以获取任意网页的内容(包括文字和图片),支持需要登录的页面。
4
4
 
5
- ## MCP 配置
5
+ ## 安装
6
6
 
7
7
  ### 方式一:全局安装(推荐)
8
8
 
@@ -37,28 +37,11 @@ npm install -g web-fetcher-mcp
37
37
 
38
38
  ### 各编辑器配置位置
39
39
 
40
- #### Claude Desktop
41
- 文件:`%APPDATA%\Claude\claude_desktop_config.json` (Windows)
42
- `~/Library/Application Support/Claude/claude_desktop_config.json` (Mac)
43
-
44
- #### Cursor
45
- 设置 → MCP → 添加服务器
46
-
47
- #### VSCode + Cline/Roo Code
48
- 在插件设置中找到 MCP 配置
49
-
50
- #### 完整配置示例
51
-
52
- ```json
53
- {
54
- "mcpServers": {
55
- "web-fetcher": {
56
- "command": "npx",
57
- "args": ["-y", "web-fetcher-mcp"]
58
- }
59
- }
60
- }
61
- ```
40
+ | 编辑器 | 配置位置 |
41
+ |--------|----------|
42
+ | Claude Desktop | `%APPDATA%\Claude\claude_desktop_config.json` (Windows) / `~/Library/Application Support/Claude/claude_desktop_config.json` (Mac) |
43
+ | Cursor | 设置 → MCP → 添加服务器 |
44
+ | VSCode + Cline/Roo Code | 插件设置中找到 MCP 配置 |
62
45
 
63
46
  ---
64
47
 
@@ -69,14 +52,25 @@ npm install -g web-fetcher-mcp
69
52
  - 支持需要登录的页面
70
53
  - 自动保存和复用登录状态(Cookie)
71
54
  - 可自定义内容选择器,精准提取页面特定区域
55
+ - 页面滚动和导航控制
56
+ - 鼠标悬停、表单填写、下拉选择等交互操作
57
+ - 文件上传支持
58
+ - 元素属性获取和等待
59
+
60
+ ## 系统要求
72
61
 
73
- ## 使用方法
62
+ - Node.js 18+
63
+ - Google Chrome 浏览器
64
+
65
+ ---
74
66
 
75
- ### 工具 1: fetch-web-page
67
+ ## 工具列表
68
+
69
+ ### 1. fetch-web-page
76
70
 
77
71
  获取网页内容(文字和图片)
78
72
 
79
- ### 参数说明
73
+ #### 参数说明
80
74
 
81
75
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
82
76
  |------|------|------|--------|------|
@@ -85,17 +79,21 @@ npm install -g web-fetcher-mcp
85
79
  | downloadImages | boolean | 否 | true | 是否下载图片 |
86
80
  | loginMode | string | 否 | 'skip' | 登录模式:skip/auto/manual |
87
81
  | waitForLogin | boolean | 否 | false | 检测到需要登录时是否等待用户手动登录 |
88
- | includeHtmlSkeleton | boolean | 否 | false | 是否返回 HTML 骨架结构(默认 false,节省 token) |
82
+ | includeHtmlSkeleton | boolean | 否 | false | 是否返回 HTML 骨架结构 |
83
+
84
+ #### 登录模式说明
89
85
 
90
- ### 登录模式说明
86
+ | 模式 | 说明 |
87
+ |------|------|
88
+ | skip (默认) | 不检测登录状态,直接获取页面内容 |
89
+ | auto | 使用保存的 Cookie 自动登录 |
90
+ | manual | 打开浏览器等待用户手动完成登录 |
91
91
 
92
- - **skip** (默认): 不检测登录状态,直接获取页面内容
93
- - **auto**: 使用保存的 Cookie 自动登录
94
- - **manual**: 打开浏览器等待用户手动完成登录
92
+ #### 示例
95
93
 
96
- ### 示例调用
94
+ <details>
95
+ <summary>普通网页抓取</summary>
97
96
 
98
- #### 普通网页抓取
99
97
  ```json
100
98
  {
101
99
  "name": "fetch-web-page",
@@ -104,8 +102,11 @@ npm install -g web-fetcher-mcp
104
102
  }
105
103
  }
106
104
  ```
105
+ </details>
106
+
107
+ <details>
108
+ <summary>抓取特定区域内容</summary>
107
109
 
108
- #### 抓取特定区域内容
109
110
  ```json
110
111
  {
111
112
  "name": "fetch-web-page",
@@ -115,8 +116,11 @@ npm install -g web-fetcher-mcp
115
116
  }
116
117
  }
117
118
  ```
119
+ </details>
120
+
121
+ <details>
122
+ <summary>需要登录的页面(首次)</summary>
118
123
 
119
- #### 需要登录的页面(首次)
120
124
  ```json
121
125
  {
122
126
  "name": "fetch-web-page",
@@ -127,8 +131,11 @@ npm install -g web-fetcher-mcp
127
131
  }
128
132
  }
129
133
  ```
134
+ </details>
135
+
136
+ <details>
137
+ <summary>需要登录的页面(后续)</summary>
130
138
 
131
- #### 需要登录的页面(后续)
132
139
  ```json
133
140
  {
134
141
  "name": "fetch-web-page",
@@ -138,10 +145,11 @@ npm install -g web-fetcher-mcp
138
145
  }
139
146
  }
140
147
  ```
148
+ </details>
141
149
 
142
150
  ---
143
151
 
144
- ### 工具 2: focus-input-element
152
+ ### 2. focus-input-element
145
153
 
146
154
  获取页面输入框焦点,支持通过 CSS 选择器定位元素。
147
155
 
@@ -150,97 +158,303 @@ npm install -g web-fetcher-mcp
150
158
  | 参数 | 类型 | 必填 | 默认值 | 说明 |
151
159
  |------|------|------|--------|------|
152
160
  | url | string | 否 | 'current' | 网页 URL,使用 'current' 则操作当前已打开的页面 |
153
- | selector | string | 是 | - | CSS 选择器,支持类名、ID、属性选择器等 |
161
+ | selector | string | 是 | - | CSS 选择器 |
154
162
  | useExistingPage | boolean | 否 | true | 是否使用已存在的页面 |
155
163
 
156
- #### 示例调用
164
+ #### 示例
157
165
 
158
- ##### 通过 ID 获取焦点
159
166
  ```json
160
- {
161
- "name": "focus-input-element",
162
- "arguments": {
163
- "selector": "#username"
164
- }
165
- }
167
+ // 通过 ID
168
+ { "selector": "#username" }
169
+
170
+ // 通过类名
171
+ { "selector": ".search-input" }
172
+
173
+ // 通过属性
174
+ { "selector": "input[name='email']" }
166
175
  ```
167
176
 
168
- ##### 通过类名获取焦点
177
+ ---
178
+
179
+ ### 3. type-input-element
180
+
181
+ 在指定的输入框中输入文本内容
182
+
183
+ #### 参数说明
184
+
185
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
186
+ |------|------|------|--------|------|
187
+ | selector | string | 是 | - | CSS 选择器 |
188
+ | text | string | 是 | - | 要输入的文本 |
189
+ | clearFirst | boolean | 否 | true | 是否先清空输入框 |
190
+ | pressEnter | boolean | 否 | false | 输入后是否按回车 |
191
+
192
+ ---
193
+
194
+ ### 4. click-element
195
+
196
+ 点击页面上的指定元素
197
+
198
+ #### 参数说明
199
+
200
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
201
+ |------|------|------|--------|------|
202
+ | selector | string | 是 | - | CSS 选择器 |
203
+
204
+ ---
205
+
206
+ ### 5. capture-element
207
+
208
+ 截取网页或指定元素的截图
209
+
210
+ #### 参数说明
211
+
212
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
213
+ |------|------|------|--------|------|
214
+ | selector | string | 否 | - | CSS 选择器,不传则全屏截图 |
215
+
216
+ ---
217
+
218
+ ### 6. get-page-info
219
+
220
+ 获取当前页面的信息(HTML骨架、文本内容等)
221
+
222
+ ---
223
+
224
+ ### 7. open-devtools
225
+
226
+ 打开浏览器开发者工具
227
+
228
+ #### 参数说明
229
+
230
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
231
+ |------|------|------|--------|------|
232
+ | mobileMode | boolean | 否 | false | 是否开启手机设备模拟模式 |
233
+
234
+ ---
235
+
236
+ ### 8. get-console-logs
237
+
238
+ 获取浏览器控制台日志
239
+
240
+ ---
241
+
242
+ ### 9. scroll-page
243
+
244
+ 滚动页面到指定位置或元素
245
+
246
+ #### 参数说明
247
+
248
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
249
+ |------|------|------|--------|------|
250
+ | url | string | 否 | 'current' | 网页 URL,使用 'current' 则操作当前已打开的页面 |
251
+ | direction | string | 否 | 'down' | 滚动方向:up/down/left/right |
252
+ | amount | number | 否 | 500 | 滚动的像素量 |
253
+ | selector | string | 否 | - | CSS 选择器,提供后则滚动到该元素位置 |
254
+ | useExistingPage | boolean | 否 | true | 是否使用已存在的页面 |
255
+
256
+ #### 示例
257
+
169
258
  ```json
170
- {
171
- "name": "focus-input-element",
172
- "arguments": {
173
- "selector": ".search-input"
174
- }
175
- }
259
+ // 向下滚动 500px
260
+ { "direction": "down", "amount": 500 }
261
+
262
+ // 滚动到指定元素
263
+ { "selector": "#footer" }
176
264
  ```
177
265
 
178
- ##### 通过属性选择器获取焦点
266
+ ---
267
+
268
+ ### 10. wait-for-element
269
+
270
+ 等待指定元素出现在页面上
271
+
272
+ #### 参数说明
273
+
274
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
275
+ |------|------|------|--------|------|
276
+ | url | string | 否 | 'current' | 网页 URL,使用 'current' 则操作当前已打开的页面 |
277
+ | selector | string | 是 | - | CSS 选择器 |
278
+ | timeout | number | 否 | 30000 | 超时时间(毫秒) |
279
+ | state | string | 否 | 'visible' | 等待状态:attached/visible/hidden |
280
+ | useExistingPage | boolean | 否 | true | 是否使用已存在的页面 |
281
+
282
+ #### 示例
283
+
179
284
  ```json
180
- {
181
- "name": "focus-input-element",
182
- "arguments": {
183
- "selector": "input[name='email']"
184
- }
185
- }
285
+ // 等待元素可见
286
+ { "selector": ".result-item", "timeout": 10000 }
287
+
288
+ // 等待元素消失(如 loading)
289
+ { "selector": ".loading", "state": "hidden" }
186
290
  ```
187
291
 
188
- ##### 操作特定页面的输入框
292
+ ---
293
+
294
+ ### 11. hover-element
295
+
296
+ 鼠标悬停在指定元素上
297
+
298
+ #### 参数说明
299
+
300
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
301
+ |------|------|------|--------|------|
302
+ | url | string | 否 | 'current' | 网页 URL,使用 'current' 则操作当前已打开的页面 |
303
+ | selector | string | 是 | - | CSS 选择器 |
304
+ | useExistingPage | boolean | 否 | true | 是否使用已存在的页面 |
305
+
306
+ #### 示例
307
+
189
308
  ```json
190
- {
191
- "name": "focus-input-element",
192
- "arguments": {
193
- "url": "https://example.com/login",
194
- "selector": "#password"
195
- }
196
- }
309
+ { "selector": ".dropdown-trigger" }
197
310
  ```
198
311
 
199
- #### 返回结果
312
+ ---
313
+
314
+ ### 12. get-element-attributes
200
315
 
201
- 成功时返回元素信息:
316
+ 获取页面元素的属性值
317
+
318
+ #### 参数说明
319
+
320
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
321
+ |------|------|------|--------|------|
322
+ | url | string | 否 | 'current' | 网页 URL,使用 'current' 则操作当前已打开的页面 |
323
+ | selector | string | 是 | - | CSS 选择器 |
324
+ | attributes | string[] | 否 | [] | 要获取的属性名列表,为空则获取所有属性 |
325
+ | useExistingPage | boolean | 否 | true | 是否使用已存在的页面 |
326
+
327
+ #### 示例
328
+
329
+ ```json
330
+ // 获取所有属性
331
+ { "selector": "#my-link" }
332
+
333
+ // 获取指定属性
334
+ { "selector": "#my-link", "attributes": ["href", "data-id", "class"] }
202
335
  ```
203
- ✅ 成功获取焦点!
204
336
 
205
- 元素信息:
206
- - 标签: input
207
- - 类型: text
208
- - ID: username
209
- - Name: user
210
- - Class: form-control
211
- - Placeholder: 请输入用户名
212
- - 当前值:
337
+ ---
338
+
339
+ ### 13. select-option
340
+
341
+ 选择下拉菜单的选项,支持原生 select 和常见 UI 框架自定义下拉
342
+
343
+ #### 参数说明
344
+
345
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
346
+ |------|------|------|--------|------|
347
+ | url | string | 否 | 'current' | 网页 URL,使用 'current' 则操作当前已打开的页面 |
348
+ | selector | string | 是 | - | CSS 选择器,指向 select 元素或自定义下拉触发元素 |
349
+ | value | string | 否 | - | 按 option 的 value 属性选择 |
350
+ | label | string | 否 | - | 按 option 的显示文本选择 |
351
+ | index | number | 否 | - | 按索引选择(从 0 开始) |
352
+ | useExistingPage | boolean | 否 | true | 是否使用已存在的页面 |
353
+
354
+ #### 示例
355
+
356
+ ```json
357
+ // 按 value 选择
358
+ { "selector": "#country", "value": "cn" }
359
+
360
+ // 按显示文本选择
361
+ { "selector": "#country", "label": "中国" }
362
+
363
+ // 按索引选择
364
+ { "selector": "#country", "index": 0 }
213
365
  ```
214
366
 
215
- ## 数据存储
367
+ ---
216
368
 
217
- - **Cookie 存储位置**: `~/.web-fetcher-mcp/cookies.json`
218
- - **图片存储位置**: `~/.web-fetcher-mcp/images/`
369
+ ### 14. navigate-history
219
370
 
220
- ## 系统要求
371
+ 浏览器前进或后退导航
221
372
 
222
- - Node.js 18+
223
- - Google Chrome 浏览器
373
+ #### 参数说明
224
374
 
225
- ## 安装和运行
375
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
376
+ |------|------|------|--------|------|
377
+ | direction | string | 否 | 'back' | 导航方向:back(后退) / forward(前进) |
226
378
 
227
- ```bash
228
- # 安装依赖
229
- npm install
379
+ #### 示例
230
380
 
231
- # 构建
232
- npm run build
381
+ ```json
382
+ // 后退
383
+ { "direction": "back" }
233
384
 
234
- # 运行
235
- npm start
385
+ // 前进
386
+ { "direction": "forward" }
236
387
  ```
237
388
 
238
- ## 使用已有 Chrome 实例(推荐)
389
+ ---
239
390
 
240
- 如需使用日常浏览器的书签和登录状态,先用以下命令启动 Chrome:
391
+ ### 15. upload-file
241
392
 
242
- ```bash
243
- "C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222
393
+ 上传文件到页面上的文件输入框
394
+
395
+ #### 参数说明
396
+
397
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
398
+ |------|------|------|--------|------|
399
+ | url | string | 否 | 'current' | 网页 URL,使用 'current' 则操作当前已打开的页面 |
400
+ | selector | string | 是 | - | CSS 选择器,指向 input[type="file"] 元素 |
401
+ | filePath | string | 是 | - | 要上传的文件的绝对路径 |
402
+ | useExistingPage | boolean | 否 | true | 是否使用已存在的页面 |
403
+
404
+ #### 示例
405
+
406
+ ```json
407
+ {
408
+ "selector": "input[type='file']",
409
+ "filePath": "C:/Users/test/document.pdf"
410
+ }
244
411
  ```
245
412
 
246
- 然后 MCP 工具会自动连接到该实例。
413
+ ---
414
+
415
+ ### 16. execute-js
416
+
417
+ 在页面中执行任意 JavaScript 代码并返回结果。可以用于执行复杂的 DOM 操作、获取数据、调用页面上的函数等。
418
+
419
+ #### 参数说明
420
+
421
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
422
+ |------|------|------|--------|------|
423
+ | url | string | 否 | 'current' | 网页 URL,使用 'current' 则操作当前已打开的页面 |
424
+ | script | string | 是 | - | 要执行的 JavaScript 代码 |
425
+ | useExistingPage | boolean | 否 | true | 是否使用已存在的页面 |
426
+
427
+ #### 示例
428
+
429
+ ```json
430
+ // 点击元素
431
+ { "script": "document.getElementById('btn').click()" }
432
+
433
+ // 获取元素文本
434
+ { "script": "document.querySelector('.title').textContent" }
435
+
436
+ // 滚动到底部
437
+ { "script": "window.scrollTo(0, document.body.scrollHeight)" }
438
+
439
+ // 获取所有链接
440
+ { "script": "Array.from(document.querySelectorAll('a')).map(a => ({text: a.textContent, href: a.href}))" }
441
+
442
+ // 修改元素样式
443
+ { "script": "document.body.style.backgroundColor = 'lightblue'" }
444
+
445
+ // 获取页面数据
446
+ { "script": "JSON.stringify({title: document.title, url: location.href, cookies: document.cookie})" }
447
+ ```
448
+
449
+ ---
450
+
451
+ ## 数据存储
452
+
453
+ | 数据类型 | 存储位置 |
454
+ |----------|----------|
455
+ | Cookie | `~/.web-fetcher-mcp/cookies.json` |
456
+ | 图片 | `~/.web-fetcher-mcp/images/` |
457
+
458
+ ## License
459
+
460
+ MIT