@pyrokine/mcp-chrome 1.1.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 +103 -53
- 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 +0 -2
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +30 -45
- 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 +4 -20
- package/dist/cdp/launcher.js.map +1 -1
- package/dist/core/auto-wait.d.ts +2 -2
- package/dist/core/auto-wait.d.ts.map +1 -1
- package/dist/core/auto-wait.js +1 -1
- package/dist/core/auto-wait.js.map +1 -1
- package/dist/core/errors.d.ts +10 -13
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +19 -25
- package/dist/core/errors.js.map +1 -1
- package/dist/core/locator.d.ts +6 -7
- package/dist/core/locator.d.ts.map +1 -1
- package/dist/core/locator.js +77 -31
- 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 +32 -33
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +154 -114
- package/dist/core/session.js.map +1 -1
- package/dist/core/types.d.ts +4 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +6 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/unified-session.d.ts +54 -67
- package/dist/core/unified-session.d.ts.map +1 -1
- package/dist/core/unified-session.js +215 -181
- package/dist/core/unified-session.js.map +1 -1
- package/dist/extension/bridge.d.ts +0 -19
- package/dist/extension/bridge.d.ts.map +1 -1
- package/dist/extension/bridge.js +6 -52
- package/dist/extension/bridge.js.map +1 -1
- package/dist/extension/http-server.d.ts +13 -11
- package/dist/extension/http-server.d.ts.map +1 -1
- package/dist/extension/http-server.js +101 -95
- package/dist/extension/http-server.js.map +1 -1
- package/dist/index.js +11 -64
- package/dist/index.js.map +1 -1
- package/dist/tools/browse.d.ts +3 -80
- package/dist/tools/browse.d.ts.map +1 -1
- package/dist/tools/browse.js +135 -291
- package/dist/tools/browse.js.map +1 -1
- package/dist/tools/cookies.d.ts +3 -71
- package/dist/tools/cookies.d.ts.map +1 -1
- package/dist/tools/cookies.js +75 -157
- package/dist/tools/cookies.js.map +1 -1
- package/dist/tools/evaluate.d.ts +3 -52
- package/dist/tools/evaluate.d.ts.map +1 -1
- package/dist/tools/evaluate.js +35 -86
- package/dist/tools/evaluate.js.map +1 -1
- package/dist/tools/extract.d.ts +3 -226
- package/dist/tools/extract.d.ts.map +1 -1
- package/dist/tools/extract.js +98 -170
- 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 -258
- package/dist/tools/input.d.ts.map +1 -1
- package/dist/tools/input.js +56 -143
- package/dist/tools/input.js.map +1 -1
- package/dist/tools/logs.d.ts +3 -51
- package/dist/tools/logs.d.ts.map +1 -1
- package/dist/tools/logs.js +47 -108
- package/dist/tools/logs.js.map +1 -1
- package/dist/tools/manage.d.ts +3 -64
- package/dist/tools/manage.d.ts.map +1 -1
- package/dist/tools/manage.js +243 -373
- package/dist/tools/manage.js.map +1 -1
- package/dist/tools/schema.d.ts +16 -182
- package/dist/tools/schema.d.ts.map +1 -1
- package/dist/tools/schema.js +70 -159
- package/dist/tools/schema.js.map +1 -1
- package/dist/tools/wait.d.ts +3 -221
- package/dist/tools/wait.d.ts.map +1 -1
- package/dist/tools/wait.js +74 -145
- package/dist/tools/wait.js.map +1 -1
- package/package.json +1 -1
package/dist/tools/cookies.js
CHANGED
|
@@ -9,146 +9,74 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { writeFile } from 'fs/promises';
|
|
11
11
|
import { z } from 'zod';
|
|
12
|
-
import { formatErrorResponse, getUnifiedSession } from '../core/index.js';
|
|
13
|
-
/**
|
|
14
|
-
* cookies 工具定义
|
|
15
|
-
*/
|
|
16
|
-
export const cookiesToolDefinition = {
|
|
17
|
-
name: 'cookies',
|
|
18
|
-
description: 'Cookie 管理:获取、设置、删除、清空',
|
|
19
|
-
inputSchema: {
|
|
20
|
-
type: 'object',
|
|
21
|
-
properties: {
|
|
22
|
-
action: {
|
|
23
|
-
type: 'string',
|
|
24
|
-
enum: ['get', 'set', 'delete', 'clear'],
|
|
25
|
-
description: '操作类型',
|
|
26
|
-
},
|
|
27
|
-
// 通用过滤参数(get/clear)
|
|
28
|
-
url: {
|
|
29
|
-
type: 'string',
|
|
30
|
-
description: 'URL 过滤(get/clear/set/delete)',
|
|
31
|
-
},
|
|
32
|
-
name: {
|
|
33
|
-
type: 'string',
|
|
34
|
-
description: 'Cookie 名称(get/set/delete 必填)',
|
|
35
|
-
},
|
|
36
|
-
domain: {
|
|
37
|
-
type: 'string',
|
|
38
|
-
description: '域名过滤(get/clear)',
|
|
39
|
-
},
|
|
40
|
-
path: {
|
|
41
|
-
type: 'string',
|
|
42
|
-
description: '路径过滤(get)或设置路径(set)',
|
|
43
|
-
},
|
|
44
|
-
secure: {
|
|
45
|
-
type: 'boolean',
|
|
46
|
-
description: '只返回 secure cookies(get)或设置 secure 属性(set)',
|
|
47
|
-
},
|
|
48
|
-
session: {
|
|
49
|
-
type: 'boolean',
|
|
50
|
-
description: '只返回会话 cookies(get)',
|
|
51
|
-
},
|
|
52
|
-
// set 专用参数
|
|
53
|
-
value: {
|
|
54
|
-
type: 'string',
|
|
55
|
-
description: 'Cookie 值(set)',
|
|
56
|
-
},
|
|
57
|
-
httpOnly: {
|
|
58
|
-
type: 'boolean',
|
|
59
|
-
description: 'httpOnly 属性(set)',
|
|
60
|
-
},
|
|
61
|
-
sameSite: {
|
|
62
|
-
type: 'string',
|
|
63
|
-
enum: ['Strict', 'Lax', 'None'],
|
|
64
|
-
description: 'SameSite 属性(set)',
|
|
65
|
-
},
|
|
66
|
-
expirationDate: {
|
|
67
|
-
type: 'number',
|
|
68
|
-
description: '过期时间戳(set)',
|
|
69
|
-
},
|
|
70
|
-
// 输出
|
|
71
|
-
output: {
|
|
72
|
-
type: 'string',
|
|
73
|
-
description: '输出文件路径(get)。若指定,cookies 导出为 JSON 文件',
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
required: ['action'],
|
|
77
|
-
},
|
|
78
|
-
};
|
|
12
|
+
import { formatErrorResponse, formatResponse, getUnifiedSession } from '../core/index.js';
|
|
79
13
|
/**
|
|
80
14
|
* cookies 参数 schema
|
|
81
15
|
*/
|
|
82
16
|
const cookiesSchema = z.object({
|
|
83
|
-
action: z.enum(['get', 'set', 'delete', 'clear']),
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
value: z.string().optional(),
|
|
93
|
-
httpOnly: z.boolean().optional(),
|
|
94
|
-
sameSite: z.enum(['Strict', 'Lax', 'None'])
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
17
|
+
action: z.enum(['get', 'set', 'delete', 'clear']).describe('操作类型'),
|
|
18
|
+
url: z.string().optional().describe('URL 过滤(get/clear/set/delete)'),
|
|
19
|
+
name: z.string().optional().describe('Cookie 名称(get/set/delete 必填)'),
|
|
20
|
+
domain: z.string().optional().describe('域名过滤(get/clear)'),
|
|
21
|
+
path: z.string().optional().describe('路径过滤(get)或设置路径(set)'),
|
|
22
|
+
secure: z.boolean()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe('只返回 secure cookies(get)或设置 secure 属性(set)'),
|
|
25
|
+
session: z.boolean().optional().describe('只返回会话 cookies(get)'),
|
|
26
|
+
value: z.string().optional().describe('Cookie 值(set)'),
|
|
27
|
+
httpOnly: z.boolean().optional().describe('httpOnly 属性(set)'),
|
|
28
|
+
sameSite: z.enum(['Strict', 'Lax', 'None'])
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('SameSite 属性(set)'),
|
|
31
|
+
expirationDate: z.number().optional().describe('过期时间戳(set)'),
|
|
32
|
+
output: z.string()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('输出文件路径(get)。若指定,cookies 导出为 JSON 文件'),
|
|
98
35
|
});
|
|
99
36
|
/**
|
|
100
37
|
* cookies 工具处理器
|
|
101
38
|
*/
|
|
102
|
-
|
|
39
|
+
async function handleCookies(args) {
|
|
103
40
|
try {
|
|
104
|
-
const args = cookiesSchema.parse(params);
|
|
105
41
|
const unifiedSession = getUnifiedSession();
|
|
106
42
|
switch (args.action) {
|
|
107
43
|
case 'get': {
|
|
108
44
|
// 构建过滤条件
|
|
109
45
|
const filter = {};
|
|
110
|
-
if (args.url)
|
|
46
|
+
if (args.url) {
|
|
111
47
|
filter.url = args.url;
|
|
112
|
-
|
|
48
|
+
}
|
|
49
|
+
if (args.name) {
|
|
113
50
|
filter.name = args.name;
|
|
114
|
-
|
|
51
|
+
}
|
|
52
|
+
if (args.domain) {
|
|
115
53
|
filter.domain = args.domain;
|
|
116
|
-
|
|
54
|
+
}
|
|
55
|
+
if (args.path) {
|
|
117
56
|
filter.path = args.path;
|
|
118
|
-
|
|
57
|
+
}
|
|
58
|
+
if (args.secure !== undefined) {
|
|
119
59
|
filter.secure = args.secure;
|
|
120
|
-
|
|
60
|
+
}
|
|
61
|
+
if (args.session !== undefined) {
|
|
121
62
|
filter.session = args.session;
|
|
63
|
+
}
|
|
122
64
|
const cookies = await unifiedSession.getCookies(filter);
|
|
123
65
|
if (args.output) {
|
|
124
66
|
await writeFile(args.output, JSON.stringify(cookies, null, 2), 'utf-8');
|
|
125
|
-
return {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
action: 'get',
|
|
132
|
-
output: args.output,
|
|
133
|
-
count: cookies.length,
|
|
134
|
-
}),
|
|
135
|
-
},
|
|
136
|
-
],
|
|
137
|
-
};
|
|
67
|
+
return formatResponse({
|
|
68
|
+
success: true,
|
|
69
|
+
action: 'get',
|
|
70
|
+
output: args.output,
|
|
71
|
+
count: cookies.length,
|
|
72
|
+
});
|
|
138
73
|
}
|
|
139
|
-
return {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
action: 'get',
|
|
146
|
-
count: cookies.length,
|
|
147
|
-
cookies,
|
|
148
|
-
}, null, 2),
|
|
149
|
-
},
|
|
150
|
-
],
|
|
151
|
-
};
|
|
74
|
+
return formatResponse({
|
|
75
|
+
success: true,
|
|
76
|
+
action: 'get',
|
|
77
|
+
count: cookies.length,
|
|
78
|
+
cookies,
|
|
79
|
+
});
|
|
152
80
|
}
|
|
153
81
|
case 'set': {
|
|
154
82
|
if (!args.url) {
|
|
@@ -208,19 +136,12 @@ export async function handleCookies(params) {
|
|
|
208
136
|
sameSite: args.sameSite,
|
|
209
137
|
expirationDate: args.expirationDate,
|
|
210
138
|
});
|
|
211
|
-
return {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
action: 'set',
|
|
218
|
-
url: args.url,
|
|
219
|
-
name: args.name,
|
|
220
|
-
}),
|
|
221
|
-
},
|
|
222
|
-
],
|
|
223
|
-
};
|
|
139
|
+
return formatResponse({
|
|
140
|
+
success: true,
|
|
141
|
+
action: 'set',
|
|
142
|
+
url: args.url,
|
|
143
|
+
name: args.name,
|
|
144
|
+
});
|
|
224
145
|
}
|
|
225
146
|
case 'delete': {
|
|
226
147
|
if (!args.url) {
|
|
@@ -256,41 +177,29 @@ export async function handleCookies(params) {
|
|
|
256
177
|
};
|
|
257
178
|
}
|
|
258
179
|
await unifiedSession.deleteCookie(args.url, args.name);
|
|
259
|
-
return {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
action: 'delete',
|
|
266
|
-
url: args.url,
|
|
267
|
-
name: args.name,
|
|
268
|
-
}),
|
|
269
|
-
},
|
|
270
|
-
],
|
|
271
|
-
};
|
|
180
|
+
return formatResponse({
|
|
181
|
+
success: true,
|
|
182
|
+
action: 'delete',
|
|
183
|
+
url: args.url,
|
|
184
|
+
name: args.name,
|
|
185
|
+
});
|
|
272
186
|
}
|
|
273
187
|
case 'clear': {
|
|
274
188
|
// 构建过滤条件
|
|
275
189
|
const filter = {};
|
|
276
|
-
if (args.url)
|
|
190
|
+
if (args.url) {
|
|
277
191
|
filter.url = args.url;
|
|
278
|
-
|
|
192
|
+
}
|
|
193
|
+
if (args.domain) {
|
|
279
194
|
filter.domain = args.domain;
|
|
195
|
+
}
|
|
280
196
|
const result = await unifiedSession.clearCookies(Object.keys(filter).length > 0 ? filter : undefined);
|
|
281
|
-
return {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
action: 'clear',
|
|
288
|
-
filter: Object.keys(filter).length > 0 ? filter : 'all',
|
|
289
|
-
count: result.count,
|
|
290
|
-
}),
|
|
291
|
-
},
|
|
292
|
-
],
|
|
293
|
-
};
|
|
197
|
+
return formatResponse({
|
|
198
|
+
success: true,
|
|
199
|
+
action: 'clear',
|
|
200
|
+
filter: Object.keys(filter).length > 0 ? filter : 'all',
|
|
201
|
+
count: result.count,
|
|
202
|
+
});
|
|
294
203
|
}
|
|
295
204
|
default:
|
|
296
205
|
return {
|
|
@@ -313,4 +222,13 @@ export async function handleCookies(params) {
|
|
|
313
222
|
return formatErrorResponse(error);
|
|
314
223
|
}
|
|
315
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* 注册 cookies 工具
|
|
227
|
+
*/
|
|
228
|
+
export function registerCookiesTool(server) {
|
|
229
|
+
server.registerTool('cookies', {
|
|
230
|
+
description: 'Cookie 管理:获取、设置、删除、清空',
|
|
231
|
+
inputSchema: cookiesSchema,
|
|
232
|
+
}, (args) => handleCookies(args));
|
|
233
|
+
}
|
|
316
234
|
//# sourceMappingURL=cookies.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/tools/cookies.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/tools/cookies.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/evaluate.d.ts
CHANGED
|
@@ -3,58 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 在页面上下文执行 JavaScript
|
|
5
5
|
*/
|
|
6
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
7
|
/**
|
|
7
|
-
* evaluate
|
|
8
|
+
* 注册 evaluate 工具
|
|
8
9
|
*/
|
|
9
|
-
export declare
|
|
10
|
-
name: string;
|
|
11
|
-
description: string;
|
|
12
|
-
inputSchema: {
|
|
13
|
-
type: "object";
|
|
14
|
-
properties: {
|
|
15
|
-
script: {
|
|
16
|
-
type: string;
|
|
17
|
-
description: string;
|
|
18
|
-
};
|
|
19
|
-
args: {
|
|
20
|
-
type: string;
|
|
21
|
-
description: string;
|
|
22
|
-
};
|
|
23
|
-
output: {
|
|
24
|
-
type: string;
|
|
25
|
-
description: string;
|
|
26
|
-
};
|
|
27
|
-
timeout: {
|
|
28
|
-
type: string;
|
|
29
|
-
description: string;
|
|
30
|
-
};
|
|
31
|
-
mode: {
|
|
32
|
-
type: string;
|
|
33
|
-
enum: string[];
|
|
34
|
-
description: string;
|
|
35
|
-
};
|
|
36
|
-
tabId: {
|
|
37
|
-
type: string;
|
|
38
|
-
description: string;
|
|
39
|
-
};
|
|
40
|
-
frame: {
|
|
41
|
-
oneOf: {
|
|
42
|
-
type: string;
|
|
43
|
-
}[];
|
|
44
|
-
description: string;
|
|
45
|
-
};
|
|
46
|
-
};
|
|
47
|
-
required: string[];
|
|
48
|
-
};
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* evaluate 工具处理器
|
|
52
|
-
*/
|
|
53
|
-
export declare function handleEvaluate(params: unknown): Promise<{
|
|
54
|
-
content: Array<{
|
|
55
|
-
type: 'text';
|
|
56
|
-
text: string;
|
|
57
|
-
}>;
|
|
58
|
-
isError?: boolean;
|
|
59
|
-
}>;
|
|
10
|
+
export declare function registerEvaluateTool(server: McpServer): void;
|
|
60
11
|
//# sourceMappingURL=evaluate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAA;AAuGtE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAK5D"}
|
package/dist/tools/evaluate.js
CHANGED
|
@@ -8,67 +8,26 @@ import { writeFile } from 'fs/promises';
|
|
|
8
8
|
import { tmpdir } from 'os';
|
|
9
9
|
import { join } from 'path';
|
|
10
10
|
import { z } from 'zod';
|
|
11
|
-
import { formatErrorResponse, getUnifiedSession } from '../core/index.js';
|
|
12
|
-
/**
|
|
13
|
-
* evaluate 工具定义
|
|
14
|
-
*/
|
|
15
|
-
export const evaluateToolDefinition = {
|
|
16
|
-
name: 'evaluate',
|
|
17
|
-
description: '在页面上下文执行 JavaScript',
|
|
18
|
-
inputSchema: {
|
|
19
|
-
type: 'object',
|
|
20
|
-
properties: {
|
|
21
|
-
script: {
|
|
22
|
-
type: 'string',
|
|
23
|
-
description: 'JavaScript 代码',
|
|
24
|
-
},
|
|
25
|
-
args: {
|
|
26
|
-
type: 'array',
|
|
27
|
-
description: '传递给脚本的参数。使用时 script 必须是函数表达式,如 "(x, y) => x + y",参数通过 IIFE 调用传入',
|
|
28
|
-
},
|
|
29
|
-
output: {
|
|
30
|
-
type: 'string',
|
|
31
|
-
description: '输出文件路径(可选)。若指定,字符串结果直接写入原始文本,其他类型序列化为 JSON',
|
|
32
|
-
},
|
|
33
|
-
timeout: {
|
|
34
|
-
type: 'number',
|
|
35
|
-
description: '超时(毫秒)。Extension 模式作为端到端预算(含传输);CDP 模式作为脚本执行超时',
|
|
36
|
-
},
|
|
37
|
-
mode: {
|
|
38
|
-
type: 'string',
|
|
39
|
-
enum: ['stealth', 'precise'],
|
|
40
|
-
description: '执行模式。precise(默认)使用 debugger API,可绕过 CSP;stealth 使用 JS 注入,不触发调试提示但受 CSP 限制',
|
|
41
|
-
},
|
|
42
|
-
tabId: {
|
|
43
|
-
type: 'string',
|
|
44
|
-
description: '目标 Tab ID(可选,仅 Extension 模式)。不指定则使用当前 attach 的 tab。可操作非当前 attach 的 tab。CDP 模式下忽略此参数',
|
|
45
|
-
},
|
|
46
|
-
frame: {
|
|
47
|
-
oneOf: [{ type: 'string' }, { type: 'number' }],
|
|
48
|
-
description: 'iframe 定位(可选,仅 Extension 模式)。CSS 选择器(如 "iframe#main")或索引(如 0)。不指定则在主框架执行',
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
required: ['script'],
|
|
52
|
-
},
|
|
53
|
-
};
|
|
11
|
+
import { formatErrorResponse, formatResponse, getUnifiedSession } from '../core/index.js';
|
|
54
12
|
/**
|
|
55
13
|
* evaluate 参数 schema
|
|
56
14
|
*/
|
|
57
15
|
const evaluateSchema = z.object({
|
|
58
|
-
script: z.string(),
|
|
59
|
-
args: z.array(z.unknown()).optional(),
|
|
60
|
-
output: z.string()
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
16
|
+
script: z.string().describe('JavaScript 代码'),
|
|
17
|
+
args: z.array(z.unknown()).optional().describe('传递给脚本的参数。使用时 script 必须是函数表达式,如 "(x, y) => x + y",参数通过 IIFE 调用传入'),
|
|
18
|
+
output: z.string()
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('输出文件路径(可选)。若指定,字符串结果直接写入原始文本,其他类型序列化为 JSON'),
|
|
21
|
+
timeout: z.number().optional().describe('超时(毫秒)。Extension 模式作为端到端预算(含传输);CDP 模式作为脚本执行超时'),
|
|
22
|
+
mode: z.enum(['stealth', 'precise']).optional().describe('执行模式。precise(默认)使用 debugger API,可绕过 CSP;stealth 使用 JS 注入,不触发调试提示但受 CSP 限制'),
|
|
23
|
+
tabId: z.string().optional().describe('目标 Tab ID(可选,仅 Extension 模式)。不指定则使用当前 attach 的 tab。可操作非当前 attach 的 tab。CDP 模式下忽略此参数'),
|
|
24
|
+
frame: z.union([z.string(), z.number()]).optional().describe('iframe 定位(可选,仅 Extension 模式)。CSS 选择器(如 "iframe#main")或索引(如 0)。不指定则在主框架执行'),
|
|
65
25
|
});
|
|
66
26
|
/**
|
|
67
27
|
* evaluate 工具处理器
|
|
68
28
|
*/
|
|
69
|
-
|
|
29
|
+
async function handleEvaluate(args) {
|
|
70
30
|
try {
|
|
71
|
-
const args = evaluateSchema.parse(params);
|
|
72
31
|
const unifiedSession = getUnifiedSession();
|
|
73
32
|
return await unifiedSession.withTabId(args.tabId, async () => {
|
|
74
33
|
return await unifiedSession.withFrame(args.frame, async () => {
|
|
@@ -78,17 +37,10 @@ export async function handleEvaluate(params) {
|
|
|
78
37
|
// string 类型直接写入原始文本,其他类型 JSON 序列化
|
|
79
38
|
const content = typeof result === 'string' ? result : JSON.stringify(normalizedResult, null, 2);
|
|
80
39
|
await writeFile(args.output, content, 'utf-8');
|
|
81
|
-
return {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
text: JSON.stringify({
|
|
86
|
-
success: true,
|
|
87
|
-
output: args.output,
|
|
88
|
-
}),
|
|
89
|
-
},
|
|
90
|
-
],
|
|
91
|
-
};
|
|
40
|
+
return formatResponse({
|
|
41
|
+
success: true,
|
|
42
|
+
output: args.output,
|
|
43
|
+
});
|
|
92
44
|
}
|
|
93
45
|
const serialized = JSON.stringify({ success: true, result: normalizedResult }, null, 2);
|
|
94
46
|
// 检测结果大小,超过 100KB 自动保存到文件
|
|
@@ -97,36 +49,24 @@ export async function handleEvaluate(params) {
|
|
|
97
49
|
const tmpPath = join(tmpdir(), `mcp-chrome-eval-${randomUUID()}.${suffix}`);
|
|
98
50
|
const fileContent = typeof result === 'string' ? result : JSON.stringify(normalizedResult, null, 2);
|
|
99
51
|
await writeFile(tmpPath, fileContent, 'utf-8');
|
|
100
|
-
return {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
path: tmpPath,
|
|
108
|
-
size: fileContent.length,
|
|
109
|
-
hint: '结果过大已自动保存到文件,请使用 Read 工具读取',
|
|
110
|
-
}),
|
|
111
|
-
},
|
|
112
|
-
],
|
|
113
|
-
};
|
|
52
|
+
return formatResponse({
|
|
53
|
+
success: true,
|
|
54
|
+
autoSaved: true,
|
|
55
|
+
path: tmpPath,
|
|
56
|
+
size: fileContent.length,
|
|
57
|
+
hint: '结果过大已自动保存到文件,请使用 Read 工具读取',
|
|
58
|
+
});
|
|
114
59
|
}
|
|
115
|
-
return {
|
|
116
|
-
content: [
|
|
117
|
-
{
|
|
118
|
-
type: 'text',
|
|
119
|
-
text: serialized,
|
|
120
|
-
},
|
|
121
|
-
],
|
|
122
|
-
};
|
|
60
|
+
return formatResponse({ success: true, result: normalizedResult });
|
|
123
61
|
});
|
|
124
62
|
}); // withTabId
|
|
125
63
|
}
|
|
126
64
|
catch (error) {
|
|
127
65
|
// 检测 CSP 错误,提示使用 precise 模式
|
|
128
66
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
129
|
-
if (errorMessage.includes('CSP') ||
|
|
67
|
+
if (errorMessage.includes('CSP') ||
|
|
68
|
+
errorMessage.includes('Content Security Policy') ||
|
|
69
|
+
errorMessage.includes('unsafe-eval')) {
|
|
130
70
|
return {
|
|
131
71
|
content: [
|
|
132
72
|
{
|
|
@@ -146,4 +86,13 @@ export async function handleEvaluate(params) {
|
|
|
146
86
|
return formatErrorResponse(error);
|
|
147
87
|
}
|
|
148
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* 注册 evaluate 工具
|
|
91
|
+
*/
|
|
92
|
+
export function registerEvaluateTool(server) {
|
|
93
|
+
server.registerTool('evaluate', {
|
|
94
|
+
description: '在页面上下文执行 JavaScript',
|
|
95
|
+
inputSchema: evaluateSchema,
|
|
96
|
+
}, (args) => handleEvaluate(args));
|
|
97
|
+
}
|
|
149
98
|
//# sourceMappingURL=evaluate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":"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"}
|