@pyrokine/mcp-chrome 1.0.0 → 1.3.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.
- package/README.md +236 -96
- package/dist/anti-detection/behavior.d.ts +0 -8
- package/dist/anti-detection/behavior.d.ts.map +1 -1
- package/dist/anti-detection/behavior.js +0 -16
- package/dist/anti-detection/behavior.js.map +1 -1
- package/dist/cdp/client.d.ts +10 -2
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +76 -61
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/launcher.d.ts +1 -8
- package/dist/cdp/launcher.d.ts.map +1 -1
- package/dist/cdp/launcher.js +18 -24
- package/dist/cdp/launcher.js.map +1 -1
- package/dist/core/auto-wait.d.ts +8 -1
- package/dist/core/auto-wait.d.ts.map +1 -1
- package/dist/core/auto-wait.js +15 -5
- package/dist/core/auto-wait.js.map +1 -1
- package/dist/core/errors.d.ts +11 -13
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +50 -31
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/locator.d.ts +17 -6
- package/dist/core/locator.d.ts.map +1 -1
- package/dist/core/locator.js +137 -28
- package/dist/core/locator.js.map +1 -1
- package/dist/core/retry.d.ts.map +1 -1
- package/dist/core/retry.js +1 -1
- package/dist/core/retry.js.map +1 -1
- package/dist/core/session.d.ts +71 -16
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +365 -124
- package/dist/core/session.js.map +1 -1
- package/dist/core/types.d.ts +15 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +11 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/unified-session.d.ts +418 -0
- package/dist/core/unified-session.d.ts.map +1 -0
- package/dist/core/unified-session.js +1044 -0
- package/dist/core/unified-session.js.map +1 -0
- package/dist/extension/bridge.d.ts +203 -0
- package/dist/extension/bridge.d.ts.map +1 -0
- package/dist/extension/bridge.js +375 -0
- package/dist/extension/bridge.js.map +1 -0
- package/dist/extension/http-server.d.ts +60 -0
- package/dist/extension/http-server.d.ts.map +1 -0
- package/dist/extension/http-server.js +319 -0
- package/dist/extension/http-server.js.map +1 -0
- package/dist/extension/index.d.ts +7 -0
- package/dist/extension/index.d.ts.map +1 -0
- package/dist/extension/index.js +6 -0
- package/dist/extension/index.js.map +1 -0
- package/dist/extension/native-host-installer.d.ts +21 -0
- package/dist/extension/native-host-installer.d.ts.map +1 -0
- package/dist/extension/native-host-installer.js +147 -0
- package/dist/extension/native-host-installer.js.map +1 -0
- package/dist/extension/socket-server.d.ts +32 -0
- package/dist/extension/socket-server.d.ts.map +1 -0
- package/dist/extension/socket-server.js +177 -0
- package/dist/extension/socket-server.js.map +1 -0
- package/dist/extension/ws-server.d.ts +40 -0
- package/dist/extension/ws-server.d.ts.map +1 -0
- package/dist/extension/ws-server.js +246 -0
- package/dist/extension/ws-server.js.map +1 -0
- package/dist/index.js +16 -67
- package/dist/index.js.map +1 -1
- package/dist/native-host/index.js +280 -0
- package/dist/native-host/mcp-chrome-host +2 -0
- package/dist/tools/browse.d.ts +3 -76
- package/dist/tools/browse.d.ts.map +1 -1
- package/dist/tools/browse.js +193 -237
- package/dist/tools/browse.js.map +1 -1
- package/dist/tools/cookies.d.ts +6 -66
- package/dist/tools/cookies.d.ts.map +1 -1
- package/dist/tools/cookies.js +129 -125
- package/dist/tools/cookies.js.map +1 -1
- package/dist/tools/evaluate.d.ts +3 -37
- package/dist/tools/evaluate.d.ts.map +1 -1
- package/dist/tools/evaluate.js +68 -55
- package/dist/tools/evaluate.js.map +1 -1
- package/dist/tools/extract.d.ts +3 -200
- package/dist/tools/extract.d.ts.map +1 -1
- package/dist/tools/extract.js +287 -238
- package/dist/tools/extract.js.map +1 -1
- package/dist/tools/index.d.ts +9 -9
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +9 -9
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/input.d.ts +3 -228
- package/dist/tools/input.d.ts.map +1 -1
- package/dist/tools/input.js +190 -129
- package/dist/tools/input.js.map +1 -1
- package/dist/tools/logs.d.ts +3 -47
- package/dist/tools/logs.d.ts.map +1 -1
- package/dist/tools/logs.js +100 -127
- package/dist/tools/logs.js.map +1 -1
- package/dist/tools/manage.d.ts +6 -51
- package/dist/tools/manage.d.ts.map +1 -1
- package/dist/tools/manage.js +284 -209
- package/dist/tools/manage.js.map +1 -1
- package/dist/tools/schema.d.ts +75 -168
- package/dist/tools/schema.d.ts.map +1 -1
- package/dist/tools/schema.js +276 -126
- package/dist/tools/schema.js.map +1 -1
- package/dist/tools/wait.d.ts +3 -191
- package/dist/tools/wait.d.ts.map +1 -1
- package/dist/tools/wait.js +298 -155
- package/dist/tools/wait.js.map +1 -1
- package/package.json +4 -5
- package/scripts/start-chrome-headless.sh +0 -37
- package/scripts/start-chrome.sh +0 -41
package/dist/tools/manage.js
CHANGED
|
@@ -8,243 +8,309 @@
|
|
|
8
8
|
* - viewport: 设置视口
|
|
9
9
|
* - userAgent: 设置 User-Agent
|
|
10
10
|
* - emulate: 设备模拟
|
|
11
|
+
* - inputMode: 设置输入模式(stealth/precise)
|
|
12
|
+
* - stealth: 注入反检测脚本
|
|
13
|
+
* - cdp: 发送任意 CDP 命令(高级)
|
|
11
14
|
*/
|
|
12
15
|
import { z } from 'zod';
|
|
13
|
-
import { devices, formatErrorResponse, getSession } from '../core/index.js';
|
|
14
|
-
/**
|
|
15
|
-
* manage 工具定义
|
|
16
|
-
*/
|
|
17
|
-
export const manageToolDefinition = {
|
|
18
|
-
name: 'manage',
|
|
19
|
-
description: '页面与环境管理:新建页面、关闭页面、缓存、视口、UA、设备模拟',
|
|
20
|
-
inputSchema: {
|
|
21
|
-
type: 'object',
|
|
22
|
-
properties: {
|
|
23
|
-
action: {
|
|
24
|
-
type: 'string',
|
|
25
|
-
enum: [
|
|
26
|
-
'newPage',
|
|
27
|
-
'closePage',
|
|
28
|
-
'clearCache',
|
|
29
|
-
'viewport',
|
|
30
|
-
'userAgent',
|
|
31
|
-
'emulate',
|
|
32
|
-
],
|
|
33
|
-
description: '管理操作',
|
|
34
|
-
},
|
|
35
|
-
targetId: {
|
|
36
|
-
type: 'string',
|
|
37
|
-
description: '目标页面 ID(closePage)',
|
|
38
|
-
},
|
|
39
|
-
cacheType: {
|
|
40
|
-
type: 'string',
|
|
41
|
-
enum: ['all', 'cookies', 'storage', 'cache'],
|
|
42
|
-
description: '清除类型(clearCache)',
|
|
43
|
-
},
|
|
44
|
-
width: {
|
|
45
|
-
type: 'number',
|
|
46
|
-
description: '视口宽度(viewport)',
|
|
47
|
-
},
|
|
48
|
-
height: {
|
|
49
|
-
type: 'number',
|
|
50
|
-
description: '视口高度(viewport)',
|
|
51
|
-
},
|
|
52
|
-
userAgent: {
|
|
53
|
-
type: 'string',
|
|
54
|
-
description: 'User-Agent 字符串(userAgent)',
|
|
55
|
-
},
|
|
56
|
-
device: {
|
|
57
|
-
type: 'string',
|
|
58
|
-
description: '设备名称(emulate),如 iPhone 13, iPad Pro',
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
required: ['action'],
|
|
62
|
-
},
|
|
63
|
-
};
|
|
16
|
+
import { devices, formatErrorResponse, formatResponse, getSession, getUnifiedSession } from '../core/index.js';
|
|
64
17
|
/**
|
|
65
18
|
* manage 参数 schema
|
|
66
19
|
*/
|
|
67
20
|
const manageSchema = z.object({
|
|
68
21
|
action: z.enum([
|
|
69
|
-
'newPage',
|
|
70
|
-
'
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
device: z.string().optional(),
|
|
22
|
+
'newPage', 'closePage', 'clearCache', 'viewport',
|
|
23
|
+
'userAgent', 'emulate', 'inputMode', 'stealth', 'cdp',
|
|
24
|
+
]).describe('管理操作'),
|
|
25
|
+
inputMode: z.enum(['stealth', 'precise']).optional().describe('输入模式(inputMode)。precise=debugger API(默认,可绕过 CSP 但显示调试提示);stealth=JS 事件模拟(不触发调试提示但受 CSP 限制,适用于反检测场景)'),
|
|
26
|
+
cdpMethod: z.string().optional().describe('CDP 方法名(cdp),如 Runtime.evaluate、Page.captureScreenshot'),
|
|
27
|
+
cdpParams: z.record(z.unknown()).optional().describe('CDP 方法参数(cdp)'),
|
|
28
|
+
targetId: z.string().optional().describe('目标页面 ID(closePage)'),
|
|
29
|
+
cacheType: z.enum(['all', 'cookies', 'storage', 'cache']).optional().describe('清除类型(clearCache)'),
|
|
30
|
+
width: z.number().optional().describe('视口宽度(viewport)'),
|
|
31
|
+
height: z.number().optional().describe('视口高度(viewport)'),
|
|
32
|
+
userAgent: z.string().optional().describe('User-Agent 字符串(userAgent)'),
|
|
33
|
+
device: z.string().optional().describe('设备名称(emulate),如 iPhone 13, iPad Pro'),
|
|
82
34
|
});
|
|
83
35
|
/**
|
|
84
36
|
* manage 工具处理器
|
|
85
37
|
*/
|
|
86
|
-
|
|
38
|
+
async function handleManage(args) {
|
|
87
39
|
try {
|
|
88
|
-
const
|
|
89
|
-
const
|
|
40
|
+
const unifiedSession = getUnifiedSession();
|
|
41
|
+
const mode = unifiedSession.getMode();
|
|
90
42
|
switch (args.action) {
|
|
91
43
|
case 'newPage': {
|
|
92
|
-
const target = await
|
|
93
|
-
return {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
action: 'newPage',
|
|
100
|
-
target,
|
|
101
|
-
}),
|
|
102
|
-
},
|
|
103
|
-
],
|
|
104
|
-
};
|
|
44
|
+
const target = await unifiedSession.newPage();
|
|
45
|
+
return formatResponse({
|
|
46
|
+
success: true,
|
|
47
|
+
action: 'newPage',
|
|
48
|
+
target,
|
|
49
|
+
mode,
|
|
50
|
+
});
|
|
105
51
|
}
|
|
106
52
|
case 'closePage': {
|
|
107
|
-
await
|
|
108
|
-
return {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
action: 'closePage',
|
|
115
|
-
targetId: args.targetId ?? 'current',
|
|
116
|
-
}),
|
|
117
|
-
},
|
|
118
|
-
],
|
|
119
|
-
};
|
|
53
|
+
await unifiedSession.closePage(args.targetId);
|
|
54
|
+
return formatResponse({
|
|
55
|
+
success: true,
|
|
56
|
+
action: 'closePage',
|
|
57
|
+
targetId: args.targetId ?? 'current',
|
|
58
|
+
mode,
|
|
59
|
+
});
|
|
120
60
|
}
|
|
121
61
|
case 'clearCache': {
|
|
122
|
-
await
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
62
|
+
return await unifiedSession.withTabId(undefined, async () => {
|
|
63
|
+
const cacheType = (args.cacheType ?? 'all');
|
|
64
|
+
if (mode === 'extension') {
|
|
65
|
+
// Extension 模式:只支持 cookies 清除
|
|
66
|
+
if (cacheType === 'all' || cacheType === 'cookies') {
|
|
67
|
+
await unifiedSession.clearCookies();
|
|
68
|
+
}
|
|
69
|
+
if (cacheType === 'storage' || cacheType === 'cache') {
|
|
70
|
+
return formatResponse({
|
|
128
71
|
success: true,
|
|
129
72
|
action: 'clearCache',
|
|
130
|
-
cacheType
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
73
|
+
cacheType,
|
|
74
|
+
mode,
|
|
75
|
+
warning: 'Extension 模式仅支持清除 cookies,storage 和 cache 需要 CDP 模式',
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const session = getSession();
|
|
81
|
+
await session.clearCache(cacheType);
|
|
82
|
+
}
|
|
83
|
+
return formatResponse({
|
|
84
|
+
success: true,
|
|
85
|
+
action: 'clearCache',
|
|
86
|
+
cacheType,
|
|
87
|
+
mode,
|
|
88
|
+
});
|
|
89
|
+
});
|
|
135
90
|
}
|
|
136
91
|
case 'viewport': {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
{
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
92
|
+
return await unifiedSession.withTabId(undefined, async () => {
|
|
93
|
+
if (args.width === undefined || args.height === undefined) {
|
|
94
|
+
return {
|
|
95
|
+
content: [
|
|
96
|
+
{
|
|
97
|
+
type: 'text',
|
|
98
|
+
text: JSON.stringify({
|
|
99
|
+
error: {
|
|
100
|
+
code: 'INVALID_ARGUMENT',
|
|
101
|
+
message: '设置视口需要 width 和 height 参数',
|
|
102
|
+
},
|
|
103
|
+
}),
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
isError: true,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
if (mode === 'extension') {
|
|
110
|
+
// Extension 模式:使用 debugger API 设置视口
|
|
111
|
+
await unifiedSession.sendCdpCommand('Emulation.setDeviceMetricsOverride', {
|
|
112
|
+
width: args.width,
|
|
113
|
+
height: args.height,
|
|
114
|
+
deviceScaleFactor: 1,
|
|
115
|
+
mobile: false,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
const session = getSession();
|
|
120
|
+
await session.setViewport(args.width, args.height);
|
|
121
|
+
}
|
|
122
|
+
// 触发 resize 事件(Emulation API 不会自动触发)
|
|
123
|
+
await unifiedSession.evaluate('window.dispatchEvent(new Event("resize"))');
|
|
124
|
+
return formatResponse({
|
|
125
|
+
success: true,
|
|
126
|
+
action: 'viewport',
|
|
127
|
+
width: args.width,
|
|
128
|
+
height: args.height,
|
|
129
|
+
mode,
|
|
130
|
+
});
|
|
131
|
+
});
|
|
167
132
|
}
|
|
168
133
|
case 'userAgent': {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
{
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
134
|
+
return await unifiedSession.withTabId(undefined, async () => {
|
|
135
|
+
if (!args.userAgent) {
|
|
136
|
+
return {
|
|
137
|
+
content: [
|
|
138
|
+
{
|
|
139
|
+
type: 'text',
|
|
140
|
+
text: JSON.stringify({
|
|
141
|
+
error: {
|
|
142
|
+
code: 'INVALID_ARGUMENT',
|
|
143
|
+
message: '设置 User-Agent 需要 userAgent 参数',
|
|
144
|
+
},
|
|
145
|
+
}),
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
isError: true,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
if (mode === 'extension') {
|
|
152
|
+
// Extension 模式:使用 debugger API 设置 UA
|
|
153
|
+
await unifiedSession.sendCdpCommand('Emulation.setUserAgentOverride', {
|
|
154
|
+
userAgent: args.userAgent,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const session = getSession();
|
|
159
|
+
await session.setUserAgent(args.userAgent);
|
|
160
|
+
}
|
|
161
|
+
return formatResponse({
|
|
162
|
+
success: true,
|
|
163
|
+
action: 'userAgent',
|
|
164
|
+
userAgent: args.userAgent,
|
|
165
|
+
mode,
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
case 'inputMode': {
|
|
170
|
+
if (!args.inputMode) {
|
|
171
|
+
// 返回当前模式
|
|
172
|
+
return formatResponse({
|
|
173
|
+
success: true,
|
|
174
|
+
action: 'inputMode',
|
|
175
|
+
currentMode: unifiedSession.getInputMode(),
|
|
176
|
+
availableModes: ['stealth', 'precise'],
|
|
177
|
+
description: {
|
|
178
|
+
stealth: 'JS 事件模拟,不触发调试提示,但受 CSP 限制(evaluate 可能失败)',
|
|
179
|
+
precise: 'debugger API,可绕过 CSP,但显示"扩展程序正在调试此浏览器"',
|
|
195
180
|
},
|
|
196
|
-
|
|
197
|
-
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
unifiedSession.setInputMode(args.inputMode);
|
|
184
|
+
return formatResponse({
|
|
185
|
+
success: true,
|
|
186
|
+
action: 'inputMode',
|
|
187
|
+
inputMode: args.inputMode,
|
|
188
|
+
mode,
|
|
189
|
+
});
|
|
198
190
|
}
|
|
199
191
|
case 'emulate': {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
192
|
+
return await unifiedSession.withTabId(undefined, async () => {
|
|
193
|
+
if (!args.device) {
|
|
194
|
+
// 列出可用设备
|
|
195
|
+
return formatResponse({
|
|
196
|
+
success: true,
|
|
197
|
+
action: 'emulate',
|
|
198
|
+
availableDevices: Object.keys(devices),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
const device = devices[args.device];
|
|
202
|
+
if (!device) {
|
|
203
|
+
return {
|
|
204
|
+
content: [
|
|
205
|
+
{
|
|
206
|
+
type: 'text',
|
|
207
|
+
text: JSON.stringify({
|
|
208
|
+
error: {
|
|
209
|
+
code: 'INVALID_ARGUMENT',
|
|
210
|
+
message: `未知设备: ${args.device}`,
|
|
211
|
+
suggestion: `可用设备: ${Object.keys(devices)
|
|
212
|
+
.join(', ')}`,
|
|
213
|
+
},
|
|
214
|
+
}),
|
|
215
|
+
},
|
|
216
|
+
],
|
|
217
|
+
isError: true,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
if (mode === 'extension') {
|
|
221
|
+
// Extension 模式:使用 debugger API
|
|
222
|
+
await unifiedSession.sendCdpCommand('Emulation.setDeviceMetricsOverride', {
|
|
223
|
+
width: device.viewport.width,
|
|
224
|
+
height: device.viewport.height,
|
|
225
|
+
deviceScaleFactor: device.viewport.deviceScaleFactor || 1,
|
|
226
|
+
mobile: device.viewport.isMobile || false,
|
|
227
|
+
});
|
|
228
|
+
await unifiedSession.sendCdpCommand('Emulation.setUserAgentOverride', {
|
|
229
|
+
userAgent: device.userAgent,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
const session = getSession();
|
|
234
|
+
await session.setViewport(device.viewport.width, device.viewport.height);
|
|
235
|
+
await session.setUserAgent(device.userAgent);
|
|
236
|
+
}
|
|
237
|
+
// 触发 resize 事件(Emulation API 不会自动触发)
|
|
238
|
+
await unifiedSession.evaluate('window.dispatchEvent(new Event("resize"))');
|
|
239
|
+
return formatResponse({
|
|
240
|
+
success: true,
|
|
241
|
+
action: 'emulate',
|
|
242
|
+
device: args.device,
|
|
243
|
+
viewport: device.viewport,
|
|
244
|
+
mode,
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
case 'stealth': {
|
|
249
|
+
return await unifiedSession.withTabId(undefined, async () => {
|
|
250
|
+
await unifiedSession.injectStealth();
|
|
251
|
+
return formatResponse({
|
|
252
|
+
success: true,
|
|
253
|
+
action: 'stealth',
|
|
254
|
+
mode,
|
|
255
|
+
note: '已注入反检测脚本',
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
case 'cdp': {
|
|
260
|
+
return await unifiedSession.withTabId(undefined, async () => {
|
|
261
|
+
if (!args.cdpMethod) {
|
|
262
|
+
return {
|
|
263
|
+
content: [
|
|
264
|
+
{
|
|
265
|
+
type: 'text',
|
|
266
|
+
text: JSON.stringify({
|
|
267
|
+
error: {
|
|
268
|
+
code: 'INVALID_ARGUMENT',
|
|
269
|
+
message: '缺少 cdpMethod 参数',
|
|
270
|
+
suggestion: '请指定 CDP 方法名,如 Runtime.evaluate、Page.captureScreenshot',
|
|
271
|
+
},
|
|
272
|
+
}),
|
|
273
|
+
},
|
|
274
|
+
],
|
|
275
|
+
isError: true,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
try {
|
|
279
|
+
const result = await unifiedSession.sendCdpCommand(args.cdpMethod, args.cdpParams);
|
|
280
|
+
return formatResponse({
|
|
281
|
+
success: true,
|
|
282
|
+
action: 'cdp',
|
|
283
|
+
method: args.cdpMethod,
|
|
284
|
+
result,
|
|
285
|
+
mode,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
290
|
+
// Extension 模式下某些 CDP 域不支持
|
|
291
|
+
if (mode ===
|
|
292
|
+
'extension' &&
|
|
293
|
+
(errorMessage.includes('not supported') || errorMessage.includes('not found'))) {
|
|
294
|
+
const domain = args.cdpMethod.split('.')[0];
|
|
295
|
+
return {
|
|
296
|
+
content: [
|
|
297
|
+
{
|
|
298
|
+
type: 'text',
|
|
299
|
+
text: JSON.stringify({
|
|
300
|
+
error: {
|
|
301
|
+
code: 'CDP_DOMAIN_NOT_SUPPORTED',
|
|
302
|
+
message: `Extension 模式不支持 ${domain} 域`,
|
|
303
|
+
suggestion: 'Extension 模式可用域:Page、Runtime、Emulation、DOM、Input、Network。如需完整 CDP 支持,请使用 CDP 模式(browse action="launch")',
|
|
304
|
+
},
|
|
305
|
+
}),
|
|
226
306
|
},
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
await session.setUserAgent(device.userAgent);
|
|
235
|
-
return {
|
|
236
|
-
content: [
|
|
237
|
-
{
|
|
238
|
-
type: 'text',
|
|
239
|
-
text: JSON.stringify({
|
|
240
|
-
success: true,
|
|
241
|
-
action: 'emulate',
|
|
242
|
-
device: args.device,
|
|
243
|
-
viewport: device.viewport,
|
|
244
|
-
}),
|
|
245
|
-
},
|
|
246
|
-
],
|
|
247
|
-
};
|
|
307
|
+
],
|
|
308
|
+
isError: true,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
return formatErrorResponse(error);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
248
314
|
}
|
|
249
315
|
default:
|
|
250
316
|
return {
|
|
@@ -267,4 +333,13 @@ export async function handleManage(params) {
|
|
|
267
333
|
return formatErrorResponse(error);
|
|
268
334
|
}
|
|
269
335
|
}
|
|
336
|
+
/**
|
|
337
|
+
* 注册 manage 工具
|
|
338
|
+
*/
|
|
339
|
+
export function registerManageTool(server) {
|
|
340
|
+
server.registerTool('manage', {
|
|
341
|
+
description: '页面与环境管理:新建页面、关闭页面、缓存、视口、UA、设备模拟',
|
|
342
|
+
inputSchema: manageSchema,
|
|
343
|
+
}, (args) => handleManage(args));
|
|
344
|
+
}
|
|
270
345
|
//# sourceMappingURL=manage.js.map
|
package/dist/tools/manage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manage.js","sourceRoot":"","sources":["../../src/tools/manage.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"manage.js","sourceRoot":"","sources":["../../src/tools/manage.ts"],"names":[],"mappings":"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"}
|