@pyrokine/mcp-chrome 1.0.0 → 1.1.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 +176 -86
- package/dist/cdp/client.d.ts +10 -0
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +48 -18
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/launcher.d.ts.map +1 -1
- package/dist/cdp/launcher.js +14 -4
- package/dist/cdp/launcher.js.map +1 -1
- package/dist/core/auto-wait.d.ts +7 -0
- package/dist/core/auto-wait.d.ts.map +1 -1
- package/dist/core/auto-wait.js +14 -4
- package/dist/core/auto-wait.js.map +1 -1
- package/dist/core/errors.d.ts +1 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +32 -7
- 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 +12 -0
- package/dist/core/locator.d.ts.map +1 -1
- package/dist/core/locator.js +73 -10
- package/dist/core/locator.js.map +1 -1
- package/dist/core/session.d.ts +66 -10
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +261 -60
- package/dist/core/session.js.map +1 -1
- package/dist/core/types.d.ts +11 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +5 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/unified-session.d.ts +431 -0
- package/dist/core/unified-session.d.ts.map +1 -0
- package/dist/core/unified-session.js +1010 -0
- package/dist/core/unified-session.js.map +1 -0
- package/dist/extension/bridge.d.ts +222 -0
- package/dist/extension/bridge.d.ts.map +1 -0
- package/dist/extension/bridge.js +421 -0
- package/dist/extension/bridge.js.map +1 -0
- package/dist/extension/http-server.d.ts +58 -0
- package/dist/extension/http-server.d.ts.map +1 -0
- package/dist/extension/http-server.js +313 -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 +6 -4
- 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 +4 -0
- package/dist/tools/browse.d.ts.map +1 -1
- package/dist/tools/browse.js +137 -25
- package/dist/tools/browse.js.map +1 -1
- package/dist/tools/cookies.d.ts +33 -25
- package/dist/tools/cookies.d.ts.map +1 -1
- package/dist/tools/cookies.js +124 -38
- package/dist/tools/cookies.js.map +1 -1
- package/dist/tools/evaluate.d.ts +15 -0
- package/dist/tools/evaluate.d.ts.map +1 -1
- package/dist/tools/evaluate.js +87 -23
- package/dist/tools/evaluate.js.map +1 -1
- package/dist/tools/extract.d.ts +28 -2
- package/dist/tools/extract.d.ts.map +1 -1
- package/dist/tools/extract.js +319 -198
- package/dist/tools/extract.js.map +1 -1
- package/dist/tools/input.d.ts +30 -0
- package/dist/tools/input.d.ts.map +1 -1
- package/dist/tools/input.js +167 -19
- package/dist/tools/input.js.map +1 -1
- package/dist/tools/logs.d.ts +4 -0
- package/dist/tools/logs.d.ts.map +1 -1
- package/dist/tools/logs.js +102 -68
- package/dist/tools/logs.js.map +1 -1
- package/dist/tools/manage.d.ts +16 -0
- package/dist/tools/manage.d.ts.map +1 -1
- package/dist/tools/manage.js +215 -10
- package/dist/tools/manage.js.map +1 -1
- package/dist/tools/schema.d.ts +86 -13
- package/dist/tools/schema.d.ts.map +1 -1
- package/dist/tools/schema.js +240 -1
- package/dist/tools/schema.js.map +1 -1
- package/dist/tools/wait.d.ts +30 -0
- package/dist/tools/wait.d.ts.map +1 -1
- package/dist/tools/wait.js +329 -115
- 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
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Chrome Native Host
|
|
4
|
+
*
|
|
5
|
+
* 作为 Chrome Extension 和 MCP Server 之间的桥梁
|
|
6
|
+
* - 通过 stdin/stdout 与 Chrome Extension 通信(Native Messaging 协议)
|
|
7
|
+
* - 通过 Unix Socket 与 MCP Server 通信
|
|
8
|
+
*
|
|
9
|
+
* 设计理念:
|
|
10
|
+
* - 事件驱动,非轮询
|
|
11
|
+
* - 任何启动顺序都能工作
|
|
12
|
+
* - 断开后自动重连
|
|
13
|
+
* - 使用指数退避 + 文件监视实现高效等待
|
|
14
|
+
*/
|
|
15
|
+
import { Socket } from 'net';
|
|
16
|
+
import { watch, existsSync } from 'fs';
|
|
17
|
+
import { tmpdir } from 'os';
|
|
18
|
+
import { join, dirname } from 'path';
|
|
19
|
+
const SOCKET_PATH = join(tmpdir(), 'mcp-chrome.sock');
|
|
20
|
+
const SOCKET_DIR = dirname(SOCKET_PATH);
|
|
21
|
+
// Native Messaging 协议:消息格式为 [4字节长度][JSON数据]
|
|
22
|
+
function readNativeMessage() {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
// 读取 4 字节的消息长度
|
|
25
|
+
const lengthBuffer = Buffer.alloc(4);
|
|
26
|
+
let bytesRead = 0;
|
|
27
|
+
const readLength = () => {
|
|
28
|
+
const chunk = process.stdin.read(4 - bytesRead);
|
|
29
|
+
if (chunk) {
|
|
30
|
+
chunk.copy(lengthBuffer, bytesRead);
|
|
31
|
+
bytesRead += chunk.length;
|
|
32
|
+
}
|
|
33
|
+
if (bytesRead < 4) {
|
|
34
|
+
process.stdin.once('readable', readLength);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const messageLength = lengthBuffer.readUInt32LE(0);
|
|
38
|
+
readMessage(messageLength);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const readMessage = (length) => {
|
|
42
|
+
const messageBuffer = Buffer.alloc(length);
|
|
43
|
+
let msgBytesRead = 0;
|
|
44
|
+
const readChunk = () => {
|
|
45
|
+
const chunk = process.stdin.read(length - msgBytesRead);
|
|
46
|
+
if (chunk) {
|
|
47
|
+
chunk.copy(messageBuffer, msgBytesRead);
|
|
48
|
+
msgBytesRead += chunk.length;
|
|
49
|
+
}
|
|
50
|
+
if (msgBytesRead < length) {
|
|
51
|
+
process.stdin.once('readable', readChunk);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
try {
|
|
55
|
+
const message = JSON.parse(messageBuffer.toString('utf8'));
|
|
56
|
+
resolve(message);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
reject(error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
readChunk();
|
|
64
|
+
};
|
|
65
|
+
readLength();
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function writeNativeMessage(message) {
|
|
69
|
+
const json = JSON.stringify(message);
|
|
70
|
+
const buffer = Buffer.from(json, 'utf8');
|
|
71
|
+
const lengthBuffer = Buffer.alloc(4);
|
|
72
|
+
lengthBuffer.writeUInt32LE(buffer.length, 0);
|
|
73
|
+
process.stdout.write(lengthBuffer);
|
|
74
|
+
process.stdout.write(buffer);
|
|
75
|
+
}
|
|
76
|
+
class NativeHost {
|
|
77
|
+
socket = null;
|
|
78
|
+
socketBuffer = '';
|
|
79
|
+
pendingRequests = new Map();
|
|
80
|
+
connected = false;
|
|
81
|
+
connecting = false;
|
|
82
|
+
watcher = null;
|
|
83
|
+
async start() {
|
|
84
|
+
// 关键:并行执行,不阻塞
|
|
85
|
+
// 1. 立即开始监听 Extension 消息(保持连接活跃)
|
|
86
|
+
// 2. 后台智能等待并连接 MCP Server
|
|
87
|
+
this.connectToServerInBackground();
|
|
88
|
+
this.listenToExtension();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 后台智能等待并连接 MCP Server
|
|
92
|
+
*
|
|
93
|
+
* 高效策略:
|
|
94
|
+
* 1. 如果 Socket 文件存在,立即尝试连接
|
|
95
|
+
* 2. 如果不存在,使用 fs.watch 监视目录,等待文件创建
|
|
96
|
+
* 3. 连接失败时使用指数退避重试
|
|
97
|
+
*
|
|
98
|
+
* 这样既能快速响应(文件创建时立即连接),又不浪费资源(无轮询)
|
|
99
|
+
*/
|
|
100
|
+
connectToServerInBackground() {
|
|
101
|
+
// 立即尝试连接一次
|
|
102
|
+
this.attemptConnect();
|
|
103
|
+
// 如果 Socket 文件不存在,监视目录等待它被创建
|
|
104
|
+
if (!existsSync(SOCKET_PATH) && !this.watcher) {
|
|
105
|
+
this.watchForSocket();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 监视 Socket 文件的创建
|
|
110
|
+
* 当 MCP Server 启动时,会创建这个文件,我们立即尝试连接
|
|
111
|
+
*/
|
|
112
|
+
watchForSocket() {
|
|
113
|
+
try {
|
|
114
|
+
this.watcher = watch(SOCKET_DIR, (eventType, filename) => {
|
|
115
|
+
if (filename === 'mcp-chrome.sock' && existsSync(SOCKET_PATH)) {
|
|
116
|
+
// Socket 文件被创建,立即尝试连接
|
|
117
|
+
this.attemptConnect();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// 监视失败(可能是权限问题),回退到指数退避轮询
|
|
123
|
+
this.startBackoffRetry();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 尝试连接,失败时使用指数退避
|
|
128
|
+
*/
|
|
129
|
+
attemptConnect() {
|
|
130
|
+
if (this.connected || this.connecting)
|
|
131
|
+
return;
|
|
132
|
+
this.connecting = true;
|
|
133
|
+
this.tryConnect()
|
|
134
|
+
.then(() => {
|
|
135
|
+
// 连接成功,停止监视
|
|
136
|
+
if (this.watcher) {
|
|
137
|
+
this.watcher.close();
|
|
138
|
+
this.watcher = null;
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
.catch(() => {
|
|
142
|
+
this.connecting = false;
|
|
143
|
+
// 如果没有在监视,启动指数退避重试
|
|
144
|
+
if (!this.watcher) {
|
|
145
|
+
this.startBackoffRetry();
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 指数退避重试
|
|
151
|
+
* 初始 1 秒,每次翻倍,最大 30 秒
|
|
152
|
+
*/
|
|
153
|
+
startBackoffRetry() {
|
|
154
|
+
let delay = 1000;
|
|
155
|
+
const maxDelay = 30000;
|
|
156
|
+
const retry = () => {
|
|
157
|
+
if (this.connected || this.connecting)
|
|
158
|
+
return;
|
|
159
|
+
this.connecting = true;
|
|
160
|
+
this.tryConnect()
|
|
161
|
+
.then(() => {
|
|
162
|
+
if (this.watcher) {
|
|
163
|
+
this.watcher.close();
|
|
164
|
+
this.watcher = null;
|
|
165
|
+
}
|
|
166
|
+
})
|
|
167
|
+
.catch(() => {
|
|
168
|
+
this.connecting = false;
|
|
169
|
+
delay = Math.min(delay * 2, maxDelay);
|
|
170
|
+
setTimeout(retry, delay);
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
setTimeout(retry, delay);
|
|
174
|
+
}
|
|
175
|
+
tryConnect() {
|
|
176
|
+
return new Promise((resolve, reject) => {
|
|
177
|
+
const socket = new Socket();
|
|
178
|
+
socket.connect(SOCKET_PATH, () => {
|
|
179
|
+
this.socket = socket;
|
|
180
|
+
this.connected = true;
|
|
181
|
+
this.connecting = false;
|
|
182
|
+
this.setupSocketHandlers();
|
|
183
|
+
resolve();
|
|
184
|
+
});
|
|
185
|
+
socket.on('error', (error) => {
|
|
186
|
+
socket.destroy();
|
|
187
|
+
reject(error);
|
|
188
|
+
});
|
|
189
|
+
// 连接超时
|
|
190
|
+
setTimeout(() => {
|
|
191
|
+
if (!this.connected) {
|
|
192
|
+
socket.destroy();
|
|
193
|
+
reject(new Error('Connection timeout'));
|
|
194
|
+
}
|
|
195
|
+
}, 2000);
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
setupSocketHandlers() {
|
|
199
|
+
if (!this.socket)
|
|
200
|
+
return;
|
|
201
|
+
this.socket.on('data', (data) => {
|
|
202
|
+
this.handleServerData(data.toString());
|
|
203
|
+
});
|
|
204
|
+
this.socket.on('close', () => {
|
|
205
|
+
this.connected = false;
|
|
206
|
+
this.connecting = false;
|
|
207
|
+
this.socket = null;
|
|
208
|
+
// 服务器断开,不退出,而是尝试重连
|
|
209
|
+
// 这样用户重启 MCP Server 后能自动恢复连接
|
|
210
|
+
this.connectToServerInBackground();
|
|
211
|
+
});
|
|
212
|
+
this.socket.on('error', (error) => {
|
|
213
|
+
writeNativeMessage({
|
|
214
|
+
type: 'error',
|
|
215
|
+
error: `Socket error: ${error.message}`,
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
handleServerData(data) {
|
|
220
|
+
this.socketBuffer += data;
|
|
221
|
+
// 按换行符分割消息
|
|
222
|
+
const lines = this.socketBuffer.split('\n');
|
|
223
|
+
this.socketBuffer = lines.pop() || '';
|
|
224
|
+
for (const line of lines) {
|
|
225
|
+
if (!line.trim())
|
|
226
|
+
continue;
|
|
227
|
+
try {
|
|
228
|
+
const message = JSON.parse(line);
|
|
229
|
+
// 将服务器的响应转发给 Extension
|
|
230
|
+
writeNativeMessage(message);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
// 忽略解析错误
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
async listenToExtension() {
|
|
238
|
+
while (true) {
|
|
239
|
+
try {
|
|
240
|
+
const message = await readNativeMessage();
|
|
241
|
+
// 处理 Extension 发来的消息
|
|
242
|
+
if (message.type === 'ping') {
|
|
243
|
+
// 心跳
|
|
244
|
+
writeNativeMessage({ type: 'pong' });
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
// 转发请求到 MCP Server
|
|
248
|
+
if (this.socket && this.connected) {
|
|
249
|
+
this.socket.write(JSON.stringify(message) + '\n');
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
// 服务器未连接
|
|
253
|
+
writeNativeMessage({
|
|
254
|
+
id: message.id,
|
|
255
|
+
success: false,
|
|
256
|
+
error: 'MCP Server not connected',
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
// stdin 关闭,退出
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// 清理
|
|
266
|
+
if (this.socket) {
|
|
267
|
+
this.socket.destroy();
|
|
268
|
+
}
|
|
269
|
+
process.exit(0);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// 启动 Native Host
|
|
273
|
+
const host = new NativeHost();
|
|
274
|
+
host.start().catch((error) => {
|
|
275
|
+
writeNativeMessage({
|
|
276
|
+
type: 'error',
|
|
277
|
+
error: error.message,
|
|
278
|
+
});
|
|
279
|
+
process.exit(1);
|
|
280
|
+
});
|
package/dist/tools/browse.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browse.d.ts","sourceRoot":"","sources":["../../src/tools/browse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH;;GAEG;AACH,eAAO,MAAM,oBAAoB
|
|
1
|
+
{"version":3,"file":"browse.d.ts","sourceRoot":"","sources":["../../src/tools/browse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoFhC,CAAA;AAkCD;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IACzD,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC,CAuXD"}
|
package/dist/tools/browse.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* - close: 关闭浏览器
|
|
13
13
|
*/
|
|
14
14
|
import { z } from 'zod';
|
|
15
|
-
import { formatErrorResponse, getSession } from '../core/index.js';
|
|
15
|
+
import { formatErrorResponse, getSession, getUnifiedSession } from '../core/index.js';
|
|
16
16
|
/**
|
|
17
17
|
* browse 工具定义
|
|
18
18
|
*/
|
|
@@ -59,10 +59,10 @@ export const browseToolDefinition = {
|
|
|
59
59
|
enum: ['off', 'safe', 'aggressive'],
|
|
60
60
|
description: '反检测模式(launch/connect)。off=关闭,safe=最小改动(默认),aggressive=完整伪装',
|
|
61
61
|
},
|
|
62
|
-
// connect 参数
|
|
62
|
+
// launch/connect 参数
|
|
63
63
|
port: {
|
|
64
64
|
type: 'number',
|
|
65
|
-
description: '调试端口(connect
|
|
65
|
+
description: '调试端口(launch/connect)。launch 时不指定则使用随机端口',
|
|
66
66
|
},
|
|
67
67
|
host: {
|
|
68
68
|
type: 'string',
|
|
@@ -71,7 +71,11 @@ export const browseToolDefinition = {
|
|
|
71
71
|
// attach 参数
|
|
72
72
|
targetId: {
|
|
73
73
|
type: 'string',
|
|
74
|
-
description: '目标 ID(attach)。从 list
|
|
74
|
+
description: '目标 ID(attach)。从 list 结果中获取。Extension 模式为数字 Tab ID,CDP 模式为 WebSocket target ID。仅在当前 mode 下有效',
|
|
75
|
+
},
|
|
76
|
+
activate: {
|
|
77
|
+
type: 'boolean',
|
|
78
|
+
description: '是否激活 Tab(attach)。默认 false 只设置操作目标不切到前台',
|
|
75
79
|
},
|
|
76
80
|
// open 参数
|
|
77
81
|
url: {
|
|
@@ -117,13 +121,14 @@ const browseSchema = z.object({
|
|
|
117
121
|
headless: z.boolean().optional(),
|
|
118
122
|
userDataDir: z.string().optional(),
|
|
119
123
|
stealth: z.enum(['off', 'safe', 'aggressive']).optional(),
|
|
120
|
-
port: z.number().optional(),
|
|
124
|
+
port: z.coerce.number().optional(),
|
|
121
125
|
host: z.string().optional(),
|
|
122
126
|
targetId: z.string().optional(),
|
|
127
|
+
activate: z.boolean().optional(),
|
|
123
128
|
url: z.string().optional(),
|
|
124
129
|
wait: z.enum(['load', 'domcontentloaded', 'networkidle']).optional(),
|
|
125
130
|
ignoreCache: z.boolean().optional(),
|
|
126
|
-
timeout: z.number().optional(),
|
|
131
|
+
timeout: z.coerce.number().optional(),
|
|
127
132
|
});
|
|
128
133
|
/**
|
|
129
134
|
* browse 工具处理器
|
|
@@ -131,17 +136,51 @@ const browseSchema = z.object({
|
|
|
131
136
|
export async function handleBrowse(params) {
|
|
132
137
|
try {
|
|
133
138
|
const args = browseSchema.parse(params);
|
|
134
|
-
const
|
|
139
|
+
const unifiedSession = getUnifiedSession();
|
|
140
|
+
const cdpSession = getSession();
|
|
141
|
+
// 优先使用 Extension 模式(如果启用了,即使当前断开也使用,会自动等待重连)
|
|
142
|
+
const useExtension = unifiedSession.isExtensionModeEnabled();
|
|
135
143
|
switch (args.action) {
|
|
136
144
|
case 'launch': {
|
|
137
|
-
|
|
145
|
+
// Extension 模式:直接创建新 Tab
|
|
146
|
+
if (useExtension) {
|
|
147
|
+
const target = await unifiedSession.launch({
|
|
148
|
+
port: args.port,
|
|
149
|
+
executablePath: args.executablePath,
|
|
150
|
+
headless: args.headless,
|
|
151
|
+
userDataDir: args.userDataDir,
|
|
152
|
+
incognito: args.incognito,
|
|
153
|
+
timeout: args.timeout,
|
|
154
|
+
stealth: args.stealth,
|
|
155
|
+
});
|
|
156
|
+
return {
|
|
157
|
+
content: [
|
|
158
|
+
{
|
|
159
|
+
type: 'text',
|
|
160
|
+
text: JSON.stringify({
|
|
161
|
+
success: true,
|
|
162
|
+
action: 'launch',
|
|
163
|
+
mode: target.mode,
|
|
164
|
+
note: target.mode === 'extension'
|
|
165
|
+
? 'Extension 模式:使用用户浏览器,共享登录状态'
|
|
166
|
+
: '已启动新浏览器(Extension 未连接,fallback 到 CDP 模式)',
|
|
167
|
+
target,
|
|
168
|
+
}, null, 2),
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// CDP 模式:启动新浏览器
|
|
174
|
+
const target = await cdpSession.launch({
|
|
138
175
|
executablePath: args.executablePath,
|
|
176
|
+
port: args.port ?? 0,
|
|
139
177
|
incognito: args.incognito ?? false,
|
|
140
178
|
headless: args.headless ?? false,
|
|
141
179
|
userDataDir: args.userDataDir,
|
|
142
180
|
timeout: args.timeout ?? 30000,
|
|
143
181
|
stealth: args.stealth,
|
|
144
182
|
});
|
|
183
|
+
const reused = target.reused ?? false;
|
|
145
184
|
return {
|
|
146
185
|
content: [
|
|
147
186
|
{
|
|
@@ -149,6 +188,12 @@ export async function handleBrowse(params) {
|
|
|
149
188
|
text: JSON.stringify({
|
|
150
189
|
success: true,
|
|
151
190
|
action: 'launch',
|
|
191
|
+
mode: 'cdp',
|
|
192
|
+
port: cdpSession.port,
|
|
193
|
+
reused,
|
|
194
|
+
note: reused
|
|
195
|
+
? '已复用运行中的浏览器,保留登录状态'
|
|
196
|
+
: '已启动新浏览器,登录状态保存在 ~/.mcp-chrome/profile',
|
|
152
197
|
target,
|
|
153
198
|
}, null, 2),
|
|
154
199
|
},
|
|
@@ -156,6 +201,26 @@ export async function handleBrowse(params) {
|
|
|
156
201
|
};
|
|
157
202
|
}
|
|
158
203
|
case 'connect': {
|
|
204
|
+
// 显式传 port 时走 CDP 连接(即使 Extension 服务器已启动)
|
|
205
|
+
if (useExtension && !args.port) {
|
|
206
|
+
const connected = unifiedSession.isExtensionConnected();
|
|
207
|
+
return {
|
|
208
|
+
content: [
|
|
209
|
+
{
|
|
210
|
+
type: 'text',
|
|
211
|
+
text: JSON.stringify({
|
|
212
|
+
success: connected,
|
|
213
|
+
action: 'connect',
|
|
214
|
+
mode: 'extension',
|
|
215
|
+
connected,
|
|
216
|
+
note: connected
|
|
217
|
+
? 'Extension 模式已连接,无需 connect'
|
|
218
|
+
: 'Extension 服务器已启动但未连接,请确保 Chrome 已运行且安装了 MCP Chrome 扩展',
|
|
219
|
+
}),
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
};
|
|
223
|
+
}
|
|
159
224
|
if (!args.port) {
|
|
160
225
|
return {
|
|
161
226
|
content: [
|
|
@@ -173,7 +238,7 @@ export async function handleBrowse(params) {
|
|
|
173
238
|
isError: true,
|
|
174
239
|
};
|
|
175
240
|
}
|
|
176
|
-
const target = await
|
|
241
|
+
const target = await cdpSession.connect({
|
|
177
242
|
host: args.host ?? '127.0.0.1',
|
|
178
243
|
port: args.port,
|
|
179
244
|
timeout: args.timeout ?? 30000,
|
|
@@ -186,6 +251,8 @@ export async function handleBrowse(params) {
|
|
|
186
251
|
text: JSON.stringify({
|
|
187
252
|
success: true,
|
|
188
253
|
action: 'connect',
|
|
254
|
+
mode: 'cdp',
|
|
255
|
+
port: args.port,
|
|
189
256
|
target,
|
|
190
257
|
}, null, 2),
|
|
191
258
|
},
|
|
@@ -193,16 +260,23 @@ export async function handleBrowse(params) {
|
|
|
193
260
|
};
|
|
194
261
|
}
|
|
195
262
|
case 'list': {
|
|
196
|
-
const
|
|
263
|
+
const mode = unifiedSession.getMode();
|
|
264
|
+
const targets = await unifiedSession.listTargets();
|
|
265
|
+
const result = {
|
|
266
|
+
success: true,
|
|
267
|
+
action: 'list',
|
|
268
|
+
mode,
|
|
269
|
+
targets,
|
|
270
|
+
};
|
|
271
|
+
// 当没有连接时,提供安装提示
|
|
272
|
+
if (mode === 'none') {
|
|
273
|
+
result.note = '未连接浏览器。请确保 Chrome 已运行且 MCP Chrome 扩展已安装。';
|
|
274
|
+
}
|
|
197
275
|
return {
|
|
198
276
|
content: [
|
|
199
277
|
{
|
|
200
278
|
type: 'text',
|
|
201
|
-
text: JSON.stringify(
|
|
202
|
-
success: true,
|
|
203
|
-
action: 'list',
|
|
204
|
-
targets,
|
|
205
|
-
}, null, 2),
|
|
279
|
+
text: JSON.stringify(result, null, 2),
|
|
206
280
|
},
|
|
207
281
|
],
|
|
208
282
|
};
|
|
@@ -225,7 +299,14 @@ export async function handleBrowse(params) {
|
|
|
225
299
|
isError: true,
|
|
226
300
|
};
|
|
227
301
|
}
|
|
228
|
-
|
|
302
|
+
if (args.activate) {
|
|
303
|
+
// 激活 Tab(切到前台)
|
|
304
|
+
await unifiedSession.activatePage(args.targetId);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
// 只设置操作目标,不激活(不切到前台)
|
|
308
|
+
await unifiedSession.selectPage(args.targetId);
|
|
309
|
+
}
|
|
229
310
|
return {
|
|
230
311
|
content: [
|
|
231
312
|
{
|
|
@@ -233,7 +314,9 @@ export async function handleBrowse(params) {
|
|
|
233
314
|
text: JSON.stringify({
|
|
234
315
|
success: true,
|
|
235
316
|
action: 'attach',
|
|
317
|
+
mode: unifiedSession.getMode(),
|
|
236
318
|
targetId: args.targetId,
|
|
319
|
+
activated: args.activate ?? false,
|
|
237
320
|
}),
|
|
238
321
|
},
|
|
239
322
|
],
|
|
@@ -257,11 +340,11 @@ export async function handleBrowse(params) {
|
|
|
257
340
|
isError: true,
|
|
258
341
|
};
|
|
259
342
|
}
|
|
260
|
-
await
|
|
343
|
+
await unifiedSession.navigate(args.url, {
|
|
261
344
|
wait: args.wait,
|
|
262
345
|
timeout: args.timeout ?? 30000,
|
|
263
346
|
});
|
|
264
|
-
const state =
|
|
347
|
+
const state = unifiedSession.getState();
|
|
265
348
|
return {
|
|
266
349
|
content: [
|
|
267
350
|
{
|
|
@@ -269,6 +352,7 @@ export async function handleBrowse(params) {
|
|
|
269
352
|
text: JSON.stringify({
|
|
270
353
|
success: true,
|
|
271
354
|
action: 'open',
|
|
355
|
+
mode: unifiedSession.getMode(),
|
|
272
356
|
url: state?.url,
|
|
273
357
|
title: state?.title,
|
|
274
358
|
}, null, 2),
|
|
@@ -277,8 +361,8 @@ export async function handleBrowse(params) {
|
|
|
277
361
|
};
|
|
278
362
|
}
|
|
279
363
|
case 'back': {
|
|
280
|
-
await
|
|
281
|
-
const state =
|
|
364
|
+
const result = await unifiedSession.goBack(args.timeout);
|
|
365
|
+
const state = unifiedSession.getState();
|
|
282
366
|
return {
|
|
283
367
|
content: [
|
|
284
368
|
{
|
|
@@ -286,16 +370,19 @@ export async function handleBrowse(params) {
|
|
|
286
370
|
text: JSON.stringify({
|
|
287
371
|
success: true,
|
|
288
372
|
action: 'back',
|
|
373
|
+
mode: unifiedSession.getMode(),
|
|
374
|
+
navigated: result.navigated,
|
|
289
375
|
url: state?.url,
|
|
290
376
|
title: state?.title,
|
|
377
|
+
...(result.navigated ? {} : { note: '无后退历史' }),
|
|
291
378
|
}),
|
|
292
379
|
},
|
|
293
380
|
],
|
|
294
381
|
};
|
|
295
382
|
}
|
|
296
383
|
case 'forward': {
|
|
297
|
-
await
|
|
298
|
-
const state =
|
|
384
|
+
const result = await unifiedSession.goForward(args.timeout);
|
|
385
|
+
const state = unifiedSession.getState();
|
|
299
386
|
return {
|
|
300
387
|
content: [
|
|
301
388
|
{
|
|
@@ -303,19 +390,23 @@ export async function handleBrowse(params) {
|
|
|
303
390
|
text: JSON.stringify({
|
|
304
391
|
success: true,
|
|
305
392
|
action: 'forward',
|
|
393
|
+
mode: unifiedSession.getMode(),
|
|
394
|
+
navigated: result.navigated,
|
|
306
395
|
url: state?.url,
|
|
307
396
|
title: state?.title,
|
|
397
|
+
...(result.navigated ? {} : { note: '无前进历史' }),
|
|
308
398
|
}),
|
|
309
399
|
},
|
|
310
400
|
],
|
|
311
401
|
};
|
|
312
402
|
}
|
|
313
403
|
case 'refresh': {
|
|
314
|
-
await
|
|
404
|
+
await unifiedSession.reload({
|
|
315
405
|
ignoreCache: args.ignoreCache ?? false,
|
|
406
|
+
waitUntil: args.wait,
|
|
316
407
|
timeout: args.timeout ?? 30000,
|
|
317
408
|
});
|
|
318
|
-
const state =
|
|
409
|
+
const state = unifiedSession.getState();
|
|
319
410
|
return {
|
|
320
411
|
content: [
|
|
321
412
|
{
|
|
@@ -323,6 +414,7 @@ export async function handleBrowse(params) {
|
|
|
323
414
|
text: JSON.stringify({
|
|
324
415
|
success: true,
|
|
325
416
|
action: 'refresh',
|
|
417
|
+
mode: unifiedSession.getMode(),
|
|
326
418
|
url: state?.url,
|
|
327
419
|
title: state?.title,
|
|
328
420
|
}),
|
|
@@ -331,7 +423,26 @@ export async function handleBrowse(params) {
|
|
|
331
423
|
};
|
|
332
424
|
}
|
|
333
425
|
case 'close': {
|
|
334
|
-
|
|
426
|
+
// 根据实际连接状态决定关闭行为,而非 extensionBridge 是否存在
|
|
427
|
+
const currentMode = unifiedSession.getMode();
|
|
428
|
+
if (currentMode !== 'cdp') {
|
|
429
|
+
return {
|
|
430
|
+
content: [
|
|
431
|
+
{
|
|
432
|
+
type: 'text',
|
|
433
|
+
text: JSON.stringify({
|
|
434
|
+
success: true,
|
|
435
|
+
action: 'close',
|
|
436
|
+
mode: currentMode,
|
|
437
|
+
note: currentMode === 'extension'
|
|
438
|
+
? 'Extension 模式:会话已结束,浏览器保持打开'
|
|
439
|
+
: '无活跃连接',
|
|
440
|
+
}),
|
|
441
|
+
},
|
|
442
|
+
],
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
await cdpSession.close();
|
|
335
446
|
return {
|
|
336
447
|
content: [
|
|
337
448
|
{
|
|
@@ -339,6 +450,7 @@ export async function handleBrowse(params) {
|
|
|
339
450
|
text: JSON.stringify({
|
|
340
451
|
success: true,
|
|
341
452
|
action: 'close',
|
|
453
|
+
mode: 'cdp',
|
|
342
454
|
}),
|
|
343
455
|
},
|
|
344
456
|
],
|
package/dist/tools/browse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browse.js","sourceRoot":"","sources":["../../src/tools/browse.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browse.js","sourceRoot":"","sources":["../../src/tools/browse.ts"],"names":[],"mappings":"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"}
|