@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.
Files changed (103) hide show
  1. package/README.md +176 -86
  2. package/dist/cdp/client.d.ts +10 -0
  3. package/dist/cdp/client.d.ts.map +1 -1
  4. package/dist/cdp/client.js +48 -18
  5. package/dist/cdp/client.js.map +1 -1
  6. package/dist/cdp/launcher.d.ts.map +1 -1
  7. package/dist/cdp/launcher.js +14 -4
  8. package/dist/cdp/launcher.js.map +1 -1
  9. package/dist/core/auto-wait.d.ts +7 -0
  10. package/dist/core/auto-wait.d.ts.map +1 -1
  11. package/dist/core/auto-wait.js +14 -4
  12. package/dist/core/auto-wait.js.map +1 -1
  13. package/dist/core/errors.d.ts +1 -0
  14. package/dist/core/errors.d.ts.map +1 -1
  15. package/dist/core/errors.js +32 -7
  16. package/dist/core/errors.js.map +1 -1
  17. package/dist/core/index.d.ts +1 -0
  18. package/dist/core/index.d.ts.map +1 -1
  19. package/dist/core/index.js +1 -0
  20. package/dist/core/index.js.map +1 -1
  21. package/dist/core/locator.d.ts +12 -0
  22. package/dist/core/locator.d.ts.map +1 -1
  23. package/dist/core/locator.js +73 -10
  24. package/dist/core/locator.js.map +1 -1
  25. package/dist/core/session.d.ts +66 -10
  26. package/dist/core/session.d.ts.map +1 -1
  27. package/dist/core/session.js +261 -60
  28. package/dist/core/session.js.map +1 -1
  29. package/dist/core/types.d.ts +11 -0
  30. package/dist/core/types.d.ts.map +1 -1
  31. package/dist/core/types.js +5 -2
  32. package/dist/core/types.js.map +1 -1
  33. package/dist/core/unified-session.d.ts +431 -0
  34. package/dist/core/unified-session.d.ts.map +1 -0
  35. package/dist/core/unified-session.js +1010 -0
  36. package/dist/core/unified-session.js.map +1 -0
  37. package/dist/extension/bridge.d.ts +222 -0
  38. package/dist/extension/bridge.d.ts.map +1 -0
  39. package/dist/extension/bridge.js +421 -0
  40. package/dist/extension/bridge.js.map +1 -0
  41. package/dist/extension/http-server.d.ts +58 -0
  42. package/dist/extension/http-server.d.ts.map +1 -0
  43. package/dist/extension/http-server.js +313 -0
  44. package/dist/extension/http-server.js.map +1 -0
  45. package/dist/extension/index.d.ts +7 -0
  46. package/dist/extension/index.d.ts.map +1 -0
  47. package/dist/extension/index.js +6 -0
  48. package/dist/extension/index.js.map +1 -0
  49. package/dist/extension/native-host-installer.d.ts +21 -0
  50. package/dist/extension/native-host-installer.d.ts.map +1 -0
  51. package/dist/extension/native-host-installer.js +147 -0
  52. package/dist/extension/native-host-installer.js.map +1 -0
  53. package/dist/extension/socket-server.d.ts +32 -0
  54. package/dist/extension/socket-server.d.ts.map +1 -0
  55. package/dist/extension/socket-server.js +177 -0
  56. package/dist/extension/socket-server.js.map +1 -0
  57. package/dist/extension/ws-server.d.ts +40 -0
  58. package/dist/extension/ws-server.d.ts.map +1 -0
  59. package/dist/extension/ws-server.js +246 -0
  60. package/dist/extension/ws-server.js.map +1 -0
  61. package/dist/index.js +6 -4
  62. package/dist/index.js.map +1 -1
  63. package/dist/native-host/index.js +280 -0
  64. package/dist/native-host/mcp-chrome-host +2 -0
  65. package/dist/tools/browse.d.ts +4 -0
  66. package/dist/tools/browse.d.ts.map +1 -1
  67. package/dist/tools/browse.js +137 -25
  68. package/dist/tools/browse.js.map +1 -1
  69. package/dist/tools/cookies.d.ts +33 -25
  70. package/dist/tools/cookies.d.ts.map +1 -1
  71. package/dist/tools/cookies.js +124 -38
  72. package/dist/tools/cookies.js.map +1 -1
  73. package/dist/tools/evaluate.d.ts +15 -0
  74. package/dist/tools/evaluate.d.ts.map +1 -1
  75. package/dist/tools/evaluate.js +87 -23
  76. package/dist/tools/evaluate.js.map +1 -1
  77. package/dist/tools/extract.d.ts +28 -2
  78. package/dist/tools/extract.d.ts.map +1 -1
  79. package/dist/tools/extract.js +319 -198
  80. package/dist/tools/extract.js.map +1 -1
  81. package/dist/tools/input.d.ts +30 -0
  82. package/dist/tools/input.d.ts.map +1 -1
  83. package/dist/tools/input.js +167 -19
  84. package/dist/tools/input.js.map +1 -1
  85. package/dist/tools/logs.d.ts +4 -0
  86. package/dist/tools/logs.d.ts.map +1 -1
  87. package/dist/tools/logs.js +102 -68
  88. package/dist/tools/logs.js.map +1 -1
  89. package/dist/tools/manage.d.ts +16 -0
  90. package/dist/tools/manage.d.ts.map +1 -1
  91. package/dist/tools/manage.js +215 -10
  92. package/dist/tools/manage.js.map +1 -1
  93. package/dist/tools/schema.d.ts +86 -13
  94. package/dist/tools/schema.d.ts.map +1 -1
  95. package/dist/tools/schema.js +240 -1
  96. package/dist/tools/schema.js.map +1 -1
  97. package/dist/tools/wait.d.ts +30 -0
  98. package/dist/tools/wait.d.ts.map +1 -1
  99. package/dist/tools/wait.js +329 -115
  100. package/dist/tools/wait.js.map +1 -1
  101. package/package.json +4 -5
  102. package/scripts/start-chrome-headless.sh +0 -37
  103. 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
+ });
@@ -0,0 +1,2 @@
1
+ #!/bin/bash
2
+ exec node "/home/py/CLion/github/claude-mcp-tools/mcp-chrome/dist/native-host/index.js" "$@"
@@ -58,6 +58,10 @@ export declare const browseToolDefinition: {
58
58
  type: string;
59
59
  description: string;
60
60
  };
61
+ activate: {
62
+ type: string;
63
+ description: string;
64
+ };
61
65
  url: {
62
66
  type: string;
63
67
  description: string;
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFhC,CAAA;AAiCD;;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,CAsQD"}
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"}
@@ -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 session = getSession();
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
- const target = await session.launch({
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 session.connect({
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 targets = await session.listTargets();
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
- await session.attachToTarget(args.targetId);
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 session.navigate(args.url, {
343
+ await unifiedSession.navigate(args.url, {
261
344
  wait: args.wait,
262
345
  timeout: args.timeout ?? 30000,
263
346
  });
264
- const state = session.getState();
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 session.goBack();
281
- const state = session.getState();
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 session.goForward();
298
- const state = session.getState();
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 session.reload({
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 = session.getState();
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
- await session.close();
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
  ],
@@ -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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"}