@pyrokine/mcp-chrome 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 (100) hide show
  1. package/README.md +333 -0
  2. package/dist/anti-detection/behavior.d.ts +58 -0
  3. package/dist/anti-detection/behavior.d.ts.map +1 -0
  4. package/dist/anti-detection/behavior.js +113 -0
  5. package/dist/anti-detection/behavior.js.map +1 -0
  6. package/dist/anti-detection/index.d.ts +6 -0
  7. package/dist/anti-detection/index.d.ts.map +1 -0
  8. package/dist/anti-detection/index.js +6 -0
  9. package/dist/anti-detection/index.js.map +1 -0
  10. package/dist/anti-detection/injection.d.ts +19 -0
  11. package/dist/anti-detection/injection.d.ts.map +1 -0
  12. package/dist/anti-detection/injection.js +270 -0
  13. package/dist/anti-detection/injection.js.map +1 -0
  14. package/dist/cdp/client.d.ts +73 -0
  15. package/dist/cdp/client.d.ts.map +1 -0
  16. package/dist/cdp/client.js +275 -0
  17. package/dist/cdp/client.js.map +1 -0
  18. package/dist/cdp/index.d.ts +6 -0
  19. package/dist/cdp/index.d.ts.map +1 -0
  20. package/dist/cdp/index.js +6 -0
  21. package/dist/cdp/index.js.map +1 -0
  22. package/dist/cdp/launcher.d.ts +42 -0
  23. package/dist/cdp/launcher.d.ts.map +1 -0
  24. package/dist/cdp/launcher.js +181 -0
  25. package/dist/cdp/launcher.js.map +1 -0
  26. package/dist/core/auto-wait.d.ts +71 -0
  27. package/dist/core/auto-wait.d.ts.map +1 -0
  28. package/dist/core/auto-wait.js +165 -0
  29. package/dist/core/auto-wait.js.map +1 -0
  30. package/dist/core/errors.d.ts +123 -0
  31. package/dist/core/errors.d.ts.map +1 -0
  32. package/dist/core/errors.js +226 -0
  33. package/dist/core/errors.js.map +1 -0
  34. package/dist/core/index.d.ts +10 -0
  35. package/dist/core/index.d.ts.map +1 -0
  36. package/dist/core/index.js +10 -0
  37. package/dist/core/index.js.map +1 -0
  38. package/dist/core/locator.d.ts +130 -0
  39. package/dist/core/locator.d.ts.map +1 -0
  40. package/dist/core/locator.js +402 -0
  41. package/dist/core/locator.js.map +1 -0
  42. package/dist/core/retry.d.ts +27 -0
  43. package/dist/core/retry.d.ts.map +1 -0
  44. package/dist/core/retry.js +51 -0
  45. package/dist/core/retry.js.map +1 -0
  46. package/dist/core/session.d.ts +254 -0
  47. package/dist/core/session.d.ts.map +1 -0
  48. package/dist/core/session.js +893 -0
  49. package/dist/core/session.js.map +1 -0
  50. package/dist/core/types.d.ts +263 -0
  51. package/dist/core/types.d.ts.map +1 -0
  52. package/dist/core/types.js +90 -0
  53. package/dist/core/types.js.map +1 -0
  54. package/dist/index.d.ts +14 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +121 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/tools/browse.d.ts +92 -0
  59. package/dist/tools/browse.d.ts.map +1 -0
  60. package/dist/tools/browse.js +368 -0
  61. package/dist/tools/browse.js.map +1 -0
  62. package/dist/tools/cookies.d.ts +75 -0
  63. package/dist/tools/cookies.d.ts.map +1 -0
  64. package/dist/tools/cookies.js +230 -0
  65. package/dist/tools/cookies.js.map +1 -0
  66. package/dist/tools/evaluate.d.ts +45 -0
  67. package/dist/tools/evaluate.d.ts.map +1 -0
  68. package/dist/tools/evaluate.js +85 -0
  69. package/dist/tools/evaluate.js.map +1 -0
  70. package/dist/tools/extract.d.ts +213 -0
  71. package/dist/tools/extract.d.ts.map +1 -0
  72. package/dist/tools/extract.js +304 -0
  73. package/dist/tools/extract.js.map +1 -0
  74. package/dist/tools/index.d.ts +13 -0
  75. package/dist/tools/index.d.ts.map +1 -0
  76. package/dist/tools/index.js +13 -0
  77. package/dist/tools/index.js.map +1 -0
  78. package/dist/tools/input.d.ts +241 -0
  79. package/dist/tools/input.d.ts.map +1 -0
  80. package/dist/tools/input.js +325 -0
  81. package/dist/tools/input.js.map +1 -0
  82. package/dist/tools/logs.d.ts +57 -0
  83. package/dist/tools/logs.d.ts.map +1 -0
  84. package/dist/tools/logs.js +165 -0
  85. package/dist/tools/logs.js.map +1 -0
  86. package/dist/tools/manage.d.ts +65 -0
  87. package/dist/tools/manage.d.ts.map +1 -0
  88. package/dist/tools/manage.js +270 -0
  89. package/dist/tools/manage.js.map +1 -0
  90. package/dist/tools/schema.d.ts +261 -0
  91. package/dist/tools/schema.d.ts.map +1 -0
  92. package/dist/tools/schema.js +151 -0
  93. package/dist/tools/schema.js.map +1 -0
  94. package/dist/tools/wait.d.ts +203 -0
  95. package/dist/tools/wait.d.ts.map +1 -0
  96. package/dist/tools/wait.js +254 -0
  97. package/dist/tools/wait.js.map +1 -0
  98. package/package.json +43 -0
  99. package/scripts/start-chrome-headless.sh +37 -0
  100. package/scripts/start-chrome.sh +41 -0
@@ -0,0 +1,254 @@
1
+ /**
2
+ * wait 工具
3
+ *
4
+ * 等待条件:
5
+ * - element: 等待元素出现/消失/可见/隐藏
6
+ * - navigation: 等待导航完成
7
+ * - time: 固定等待时间
8
+ * - idle: 等待网络空闲
9
+ */
10
+ import { z } from 'zod';
11
+ import { formatErrorResponse, getSession, TimeoutError } from '../core/index.js';
12
+ import { targetJsonSchema, targetZodSchema } from './schema.js';
13
+ /**
14
+ * wait 工具定义
15
+ */
16
+ export const waitToolDefinition = {
17
+ name: 'wait',
18
+ description: '等待条件:元素、导航、时间',
19
+ inputSchema: {
20
+ type: 'object',
21
+ properties: {
22
+ for: {
23
+ type: 'string',
24
+ enum: ['element', 'navigation', 'time', 'idle'],
25
+ description: '等待类型',
26
+ },
27
+ target: {
28
+ ...targetJsonSchema,
29
+ description: '目标元素(for=element 时必填;navigation/time/idle 不需要)',
30
+ },
31
+ state: {
32
+ type: 'string',
33
+ enum: ['visible', 'hidden', 'attached', 'detached'],
34
+ description: '元素状态(element)',
35
+ },
36
+ ms: {
37
+ type: 'number',
38
+ description: '毫秒(time)',
39
+ },
40
+ timeout: {
41
+ type: 'number',
42
+ description: '超时',
43
+ },
44
+ },
45
+ required: ['for'],
46
+ },
47
+ };
48
+ /**
49
+ * wait 参数 schema
50
+ */
51
+ const waitSchema = z.object({
52
+ for: z.enum(['element', 'navigation', 'time', 'idle']),
53
+ target: targetZodSchema.optional(),
54
+ state: z.enum(['visible', 'hidden', 'attached', 'detached']).optional(),
55
+ ms: z.number().optional(),
56
+ timeout: z.number().optional(),
57
+ });
58
+ /**
59
+ * wait 工具处理器
60
+ */
61
+ export async function handleWait(params) {
62
+ try {
63
+ const args = waitSchema.parse(params);
64
+ const session = getSession();
65
+ const timeout = args.timeout ?? 30000;
66
+ switch (args.for) {
67
+ case 'element': {
68
+ if (!args.target) {
69
+ return {
70
+ content: [
71
+ {
72
+ type: 'text',
73
+ text: JSON.stringify({
74
+ error: {
75
+ code: 'INVALID_ARGUMENT',
76
+ message: '等待元素需要 target 参数',
77
+ },
78
+ }),
79
+ },
80
+ ],
81
+ isError: true,
82
+ };
83
+ }
84
+ const state = args.state ?? 'visible';
85
+ await waitForElement(session, args.target, state, timeout);
86
+ return {
87
+ content: [
88
+ {
89
+ type: 'text',
90
+ text: JSON.stringify({
91
+ success: true,
92
+ waited: 'element',
93
+ state,
94
+ }),
95
+ },
96
+ ],
97
+ };
98
+ }
99
+ case 'navigation': {
100
+ // 等待页面加载完成
101
+ await waitForNavigation(session, timeout);
102
+ const sessionState = session.getState();
103
+ return {
104
+ content: [
105
+ {
106
+ type: 'text',
107
+ text: JSON.stringify({
108
+ success: true,
109
+ waited: 'navigation',
110
+ url: sessionState?.url,
111
+ title: sessionState?.title,
112
+ }),
113
+ },
114
+ ],
115
+ };
116
+ }
117
+ case 'time': {
118
+ if (!args.ms) {
119
+ return {
120
+ content: [
121
+ {
122
+ type: 'text',
123
+ text: JSON.stringify({
124
+ error: {
125
+ code: 'INVALID_ARGUMENT',
126
+ message: '等待时间需要 ms 参数',
127
+ },
128
+ }),
129
+ },
130
+ ],
131
+ isError: true,
132
+ };
133
+ }
134
+ await new Promise((resolve) => setTimeout(resolve, args.ms));
135
+ return {
136
+ content: [
137
+ {
138
+ type: 'text',
139
+ text: JSON.stringify({
140
+ success: true,
141
+ waited: 'time',
142
+ ms: args.ms,
143
+ }),
144
+ },
145
+ ],
146
+ };
147
+ }
148
+ case 'idle': {
149
+ // 等待网络空闲
150
+ await waitForNetworkIdle(session, timeout);
151
+ return {
152
+ content: [
153
+ {
154
+ type: 'text',
155
+ text: JSON.stringify({
156
+ success: true,
157
+ waited: 'idle',
158
+ }),
159
+ },
160
+ ],
161
+ };
162
+ }
163
+ default:
164
+ return {
165
+ content: [
166
+ {
167
+ type: 'text',
168
+ text: JSON.stringify({
169
+ error: {
170
+ code: 'INVALID_ARGUMENT',
171
+ message: `未知等待类型: ${args.for}`,
172
+ },
173
+ }),
174
+ },
175
+ ],
176
+ isError: true,
177
+ };
178
+ }
179
+ }
180
+ catch (error) {
181
+ return formatErrorResponse(error);
182
+ }
183
+ }
184
+ /**
185
+ * 等待元素
186
+ */
187
+ async function waitForElement(session, target, state, timeout) {
188
+ const startTime = Date.now();
189
+ const retryDelay = 100;
190
+ while (Date.now() - startTime < timeout) {
191
+ try {
192
+ const locator = session.createLocator(target);
193
+ switch (state) {
194
+ case 'attached':
195
+ case 'visible': {
196
+ // 尝试找到元素
197
+ await locator.find();
198
+ if (state === 'visible') {
199
+ // 还需要检查可见性
200
+ const box = await locator.getBoundingBox();
201
+ if (box.width > 0 && box.height > 0) {
202
+ return; // 元素可见
203
+ }
204
+ }
205
+ else {
206
+ return; // 元素存在
207
+ }
208
+ break;
209
+ }
210
+ case 'detached':
211
+ case 'hidden': {
212
+ try {
213
+ await locator.find();
214
+ if (state === 'hidden') {
215
+ // 元素存在,检查是否隐藏
216
+ const box = await locator.getBoundingBox();
217
+ if (box.width === 0 || box.height === 0) {
218
+ return; // 元素隐藏
219
+ }
220
+ }
221
+ // 元素仍然存在,继续等待
222
+ }
223
+ catch {
224
+ // 元素不存在,符合预期
225
+ return;
226
+ }
227
+ break;
228
+ }
229
+ }
230
+ }
231
+ catch {
232
+ // 元素未找到
233
+ if (state === 'detached' || state === 'hidden') {
234
+ return; // 符合预期
235
+ }
236
+ // 继续等待
237
+ }
238
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
239
+ }
240
+ throw new TimeoutError(`等待元素 ${JSON.stringify(target)} 状态 ${state} 超时 (${timeout}ms)`);
241
+ }
242
+ /**
243
+ * 等待导航完成(复用 session 的事件驱动实现)
244
+ */
245
+ async function waitForNavigation(session, timeout) {
246
+ await session.waitForNavigation(timeout);
247
+ }
248
+ /**
249
+ * 等待网络空闲(复用 session 的事件驱动实现)
250
+ */
251
+ async function waitForNetworkIdle(session, timeout) {
252
+ await session.waitForNetworkIdle(timeout);
253
+ }
254
+ //# sourceMappingURL=wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/tools/wait.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@pyrokine/mcp-chrome",
3
+ "version": "1.0.0",
4
+ "description": "Chrome browser automation MCP Server using Chrome DevTools Protocol",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "start": "node dist/index.js",
10
+ "dev": "tsc -w",
11
+ "prepare": "npm run build"
12
+ },
13
+ "keywords": [
14
+ "mcp",
15
+ "browser",
16
+ "automation",
17
+ "cdp",
18
+ "chrome",
19
+ "puppeteer"
20
+ ],
21
+ "author": "Pyrokine",
22
+ "license": "MIT",
23
+ "dependencies": {
24
+ "@modelcontextprotocol/sdk": "^1.0.0",
25
+ "ws": "^8.18.0",
26
+ "zod": "^3.24.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^22.0.0",
30
+ "@types/ws": "^8.5.0",
31
+ "typescript": "^5.7.0"
32
+ },
33
+ "engines": {
34
+ "node": ">=18"
35
+ },
36
+ "bin": {
37
+ "mcp-chrome": "./dist/index.js"
38
+ },
39
+ "files": [
40
+ "dist",
41
+ "scripts"
42
+ ]
43
+ }
@@ -0,0 +1,37 @@
1
+ #!/bin/bash
2
+
3
+ # MCP Browser - Chrome 无头模式启动脚本
4
+ # 启动无头 Chrome(适合服务器环境)
5
+
6
+ PORT="${1:-9222}"
7
+
8
+ echo "Starting Chrome in headless mode on port $PORT..."
9
+
10
+ # 检测操作系统和 Chrome 路径
11
+ if [[ "$OSTYPE" == "darwin"* ]]; then
12
+ CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
13
+ elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
14
+ if command -v google-chrome &> /dev/null; then
15
+ CHROME_PATH="google-chrome"
16
+ elif command -v google-chrome-stable &> /dev/null; then
17
+ CHROME_PATH="google-chrome-stable"
18
+ elif command -v chromium &> /dev/null; then
19
+ CHROME_PATH="chromium"
20
+ else
21
+ echo "Error: Chrome/Chromium not found"
22
+ exit 1
23
+ fi
24
+ else
25
+ echo "Error: Unsupported OS"
26
+ exit 1
27
+ fi
28
+
29
+ # 启动无头 Chrome
30
+ "$CHROME_PATH" \
31
+ --headless=new \
32
+ --remote-debugging-port="$PORT" \
33
+ --disable-gpu \
34
+ --no-sandbox \
35
+ --disable-dev-shm-usage \
36
+ --window-size=1920,1080 \
37
+ "$@"
@@ -0,0 +1,41 @@
1
+ #!/bin/bash
2
+
3
+ # MCP Browser - Chrome 启动脚本
4
+ # 启动带远程调试端口的 Chrome 浏览器
5
+
6
+ PORT="${1:-9222}"
7
+ PROFILE_DIR="${HOME}/.chrome-mcp-profile"
8
+
9
+ echo "Starting Chrome with remote debugging on port $PORT..."
10
+ echo "Profile directory: $PROFILE_DIR"
11
+
12
+ # 检测操作系统
13
+ if [[ "$OSTYPE" == "darwin"* ]]; then
14
+ # macOS
15
+ CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
16
+ elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
17
+ # Linux
18
+ if command -v google-chrome &> /dev/null; then
19
+ CHROME_PATH="google-chrome"
20
+ elif command -v google-chrome-stable &> /dev/null; then
21
+ CHROME_PATH="google-chrome-stable"
22
+ elif command -v chromium &> /dev/null; then
23
+ CHROME_PATH="chromium"
24
+ elif command -v chromium-browser &> /dev/null; then
25
+ CHROME_PATH="chromium-browser"
26
+ else
27
+ echo "Error: Chrome/Chromium not found"
28
+ exit 1
29
+ fi
30
+ else
31
+ echo "Error: Unsupported OS"
32
+ exit 1
33
+ fi
34
+
35
+ # 启动 Chrome
36
+ "$CHROME_PATH" \
37
+ --remote-debugging-port="$PORT" \
38
+ --user-data-dir="$PROFILE_DIR" \
39
+ --no-first-run \
40
+ --no-default-browser-check \
41
+ "$@"