web-fetcher-mcp 1.0.0

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 (58) hide show
  1. package/README.md +185 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +278 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/tools/click-element.d.ts +3 -0
  7. package/dist/tools/click-element.d.ts.map +1 -0
  8. package/dist/tools/click-element.js +166 -0
  9. package/dist/tools/click-element.js.map +1 -0
  10. package/dist/tools/focus-input.d.ts +3 -0
  11. package/dist/tools/focus-input.d.ts.map +1 -0
  12. package/dist/tools/focus-input.js +78 -0
  13. package/dist/tools/focus-input.js.map +1 -0
  14. package/dist/tools/tapd-bug-fetcher.d.ts +20 -0
  15. package/dist/tools/tapd-bug-fetcher.d.ts.map +1 -0
  16. package/dist/tools/tapd-bug-fetcher.js +376 -0
  17. package/dist/tools/tapd-bug-fetcher.js.map +1 -0
  18. package/dist/tools/type-input.d.ts +3 -0
  19. package/dist/tools/type-input.d.ts.map +1 -0
  20. package/dist/tools/type-input.js +97 -0
  21. package/dist/tools/type-input.js.map +1 -0
  22. package/dist/tools/utils/utils.d.ts +2 -0
  23. package/dist/tools/utils/utils.d.ts.map +1 -0
  24. package/dist/tools/utils/utils.js +7 -0
  25. package/dist/tools/utils/utils.js.map +1 -0
  26. package/dist/tools/web-page-fetcher.d.ts +3 -0
  27. package/dist/tools/web-page-fetcher.d.ts.map +1 -0
  28. package/dist/tools/web-page-fetcher.js +100 -0
  29. package/dist/tools/web-page-fetcher.js.map +1 -0
  30. package/dist/types/index.d.ts +73 -0
  31. package/dist/types/index.d.ts.map +1 -0
  32. package/dist/types/index.js +3 -0
  33. package/dist/types/index.js.map +1 -0
  34. package/dist/utils/browser.d.ts +6 -0
  35. package/dist/utils/browser.d.ts.map +1 -0
  36. package/dist/utils/browser.js +95 -0
  37. package/dist/utils/browser.js.map +1 -0
  38. package/dist/utils/config.d.ts +7 -0
  39. package/dist/utils/config.d.ts.map +1 -0
  40. package/dist/utils/config.js +11 -0
  41. package/dist/utils/config.js.map +1 -0
  42. package/dist/utils/cookies.d.ts +5 -0
  43. package/dist/utils/cookies.d.ts.map +1 -0
  44. package/dist/utils/cookies.js +46 -0
  45. package/dist/utils/cookies.js.map +1 -0
  46. package/dist/utils/images.d.ts +5 -0
  47. package/dist/utils/images.d.ts.map +1 -0
  48. package/dist/utils/images.js +59 -0
  49. package/dist/utils/images.js.map +1 -0
  50. package/dist/utils/login-check.d.ts +4 -0
  51. package/dist/utils/login-check.d.ts.map +1 -0
  52. package/dist/utils/login-check.js +110 -0
  53. package/dist/utils/login-check.js.map +1 -0
  54. package/dist/utils/page-content.d.ts +4 -0
  55. package/dist/utils/page-content.d.ts.map +1 -0
  56. package/dist/utils/page-content.js +139 -0
  57. package/dist/utils/page-content.js.map +1 -0
  58. package/package.json +47 -0
@@ -0,0 +1,139 @@
1
+ // 提取页面内容
2
+ export async function extractPageContent(page, contentSelector = 'body') {
3
+ const content = await page.evaluate((selector) => {
4
+ let detailElement = document.querySelector(selector);
5
+ let text = '';
6
+ let images = [];
7
+ // 提取表单元素信息
8
+ const formElements = [];
9
+ const allInputs = document.querySelectorAll('input, button, textarea, select, [role="button"]');
10
+ allInputs.forEach((el, index) => {
11
+ const element = el;
12
+ const tagName = element.tagName.toLowerCase();
13
+ const inputType = element.getAttribute('type') || '';
14
+ const id = element.id || '';
15
+ const className = element.className || '';
16
+ const name = element.getAttribute('name') || '';
17
+ const placeholder = element.getAttribute('placeholder') || '';
18
+ const textContent = element.textContent?.trim() || '';
19
+ // 生成推荐的选择器
20
+ let selectorStr = '';
21
+ if (id) {
22
+ selectorStr = `#${id}`;
23
+ }
24
+ else if (name) {
25
+ selectorStr = `${tagName}[name="${name}"]`;
26
+ }
27
+ else if (className) {
28
+ const classes = className.split(' ').filter(c => c).join('.');
29
+ selectorStr = `.${classes}`;
30
+ }
31
+ else {
32
+ selectorStr = `${tagName}:nth-of-type(${index + 1})`;
33
+ }
34
+ // 只保留重要的表单元素
35
+ const isImportant = tagName === 'button' ||
36
+ tagName === 'input' && ['text', 'password', 'email', 'tel', 'checkbox', 'submit', 'button'].includes(inputType) ||
37
+ tagName === 'textarea' ||
38
+ tagName === 'select' ||
39
+ element.getAttribute('role') === 'button' ||
40
+ /登录|Login|提交|Submit|同意|Agree|注册|Register/i.test(textContent);
41
+ if (isImportant) {
42
+ formElements.push({
43
+ tagName,
44
+ type: inputType || undefined,
45
+ name: name || undefined,
46
+ id: id || undefined,
47
+ className: className || undefined,
48
+ placeholder: placeholder || undefined,
49
+ value: element.value || textContent || undefined,
50
+ selector: selectorStr
51
+ });
52
+ }
53
+ });
54
+ if (detailElement) {
55
+ // 提取文本内容
56
+ text = detailElement.innerText || '';
57
+ // 提取图片
58
+ const imgElements = detailElement.querySelectorAll('img');
59
+ imgElements.forEach((img) => {
60
+ const src = img.getAttribute('src') || img.getAttribute('data-src');
61
+ if (src) {
62
+ images.push(src);
63
+ }
64
+ });
65
+ }
66
+ else {
67
+ // 如果找不到指定元素,获取整个 HTML
68
+ text = document.documentElement.innerText || '';
69
+ // 提取整个页面的图片
70
+ const imgElements = document.querySelectorAll('img');
71
+ imgElements.forEach((img) => {
72
+ const src = img.getAttribute('src') || img.getAttribute('data-src');
73
+ if (src) {
74
+ images.push(src);
75
+ }
76
+ });
77
+ }
78
+ // 生成 HTML 骨架(简化版)
79
+ const htmlSkeleton = (() => {
80
+ const body = document.body;
81
+ if (!body)
82
+ return '';
83
+ // 递归生成骨架
84
+ const generateSkeleton = (element, depth = 0) => {
85
+ if (depth > 3)
86
+ return ''; // 限制深度
87
+ const tagName = element.tagName.toLowerCase();
88
+ const id = element.id ? ` id="${element.id}"` : '';
89
+ const className = element.className && typeof element.className === 'string'
90
+ ? ` class="${element.className.split(' ').slice(0, 2).join(' ')}"`
91
+ : '';
92
+ // 只保留重要标签
93
+ const importantTags = ['form', 'input', 'button', 'a', 'div', 'span', 'section', 'article', 'header', 'footer', 'nav'];
94
+ if (!importantTags.includes(tagName)) {
95
+ return '';
96
+ }
97
+ // 跳过脚本和样式
98
+ if (['script', 'style', 'link', 'meta'].includes(tagName)) {
99
+ return '';
100
+ }
101
+ let skeleton = ' '.repeat(depth) + `<${tagName}${id}${className}>`;
102
+ // 如果是表单元素,添加更多信息
103
+ if (tagName === 'input') {
104
+ const type = element.getAttribute('type') || 'text';
105
+ const name = element.getAttribute('name') || '';
106
+ const placeholder = element.getAttribute('placeholder') || '';
107
+ skeleton += ` [type=${type}${name ? ` name=${name}` : ''}${placeholder ? ` placeholder=${placeholder.slice(0, 20)}` : ''}]`;
108
+ }
109
+ if (tagName === 'button' || (tagName === 'div' && element.getAttribute('role') === 'button')) {
110
+ const text = element.textContent?.trim().slice(0, 30) || '';
111
+ if (text)
112
+ skeleton += ` [text="${text}"]`;
113
+ }
114
+ const children = Array.from(element.children);
115
+ if (children.length > 0 && depth < 3) {
116
+ skeleton += '\n';
117
+ children.slice(0, 5).forEach(child => {
118
+ const childSkeleton = generateSkeleton(child, depth + 1);
119
+ if (childSkeleton)
120
+ skeleton += childSkeleton + '\n';
121
+ });
122
+ skeleton += ' '.repeat(depth);
123
+ }
124
+ skeleton += `</${tagName}>`;
125
+ return skeleton;
126
+ };
127
+ return generateSkeleton(body, 0);
128
+ })();
129
+ return {
130
+ text,
131
+ images,
132
+ downloadedImages: [],
133
+ formElements: formElements.slice(0, 20), // 限制数量
134
+ htmlSkeleton: htmlSkeleton.slice(0, 5000) // 限制长度
135
+ };
136
+ }, contentSelector);
137
+ return content;
138
+ }
139
+ //# sourceMappingURL=page-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-content.js","sourceRoot":"","sources":["../../src/utils/page-content.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "web-fetcher-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP Server for fetching any web page content with login support",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "web-fetcher-mcp": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "type": "module",
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "start": "node dist/index.js",
16
+ "dev": "tsx src/index.ts",
17
+ "test": "echo \"Error: no test specified\" && exit 1",
18
+ "prepublishOnly": "npm run build",
19
+ "release": "node publish.js",
20
+ "release:minor": "node publish.js minor",
21
+ "release:major": "node publish.js major"
22
+ },
23
+ "keywords": [
24
+ "mcp",
25
+ "web",
26
+ "fetcher",
27
+ "scraper",
28
+ "puppeteer"
29
+ ],
30
+ "author": "",
31
+ "license": "ISC",
32
+ "dependencies": {
33
+ "@modelcontextprotocol/sdk": "^1.27.1",
34
+ "axios": "^1.13.6",
35
+ "cheerio": "^1.2.0",
36
+ "puppeteer": "^20.0.0",
37
+ "zod": "^4.3.6"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^25.5.0",
41
+ "tsx": "^4.21.0",
42
+ "typescript": "^5.9.3"
43
+ },
44
+ "volta": {
45
+ "node": "18.18.0"
46
+ }
47
+ }