botbrowser-mcp 0.1.8 → 1.0.1
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/dist/db/database.js +8 -0
- package/dist/db/database.js.map +1 -1
- package/dist/db/repositories/profile.d.ts +2 -0
- package/dist/db/repositories/profile.js +6 -3
- package/dist/db/repositories/profile.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/playwright/manager.js +20 -11
- package/dist/playwright/manager.js.map +1 -1
- package/dist/tools/playwright-mcp-proxy.d.ts +6 -2
- package/dist/tools/playwright-mcp-proxy.js +58 -6
- package/dist/tools/playwright-mcp-proxy.js.map +1 -1
- package/package.json +1 -1
- package/readme.md +110 -13
package/dist/db/database.js
CHANGED
|
@@ -22,6 +22,7 @@ export function initDatabase() {
|
|
|
22
22
|
executable_path TEXT NOT NULL,
|
|
23
23
|
fingerprint_path TEXT,
|
|
24
24
|
storage_state_path TEXT,
|
|
25
|
+
user_data_dir TEXT,
|
|
25
26
|
description TEXT,
|
|
26
27
|
proxy_server TEXT,
|
|
27
28
|
proxy_username TEXT,
|
|
@@ -31,6 +32,13 @@ export function initDatabase() {
|
|
|
31
32
|
last_used TEXT
|
|
32
33
|
)
|
|
33
34
|
`);
|
|
35
|
+
// 迁移:为现有表添加 user_data_dir 字段(如果不存在)
|
|
36
|
+
try {
|
|
37
|
+
db.exec(`ALTER TABLE browser_profiles ADD COLUMN user_data_dir TEXT`);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
// 字段已存在,忽略错误
|
|
41
|
+
}
|
|
34
42
|
// 账号表
|
|
35
43
|
db.exec(`
|
|
36
44
|
CREATE TABLE IF NOT EXISTS accounts (
|
package/dist/db/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAEnD,SAAS;AACT,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,EAAE,GAA2B,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;AAGhE,SAAS;AACT,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE/B,MAAM,UAAU,YAAY;IAC1B,SAAS;IACT,EAAE,CAAC,IAAI,CAAC
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAEnD,SAAS;AACT,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,EAAE,GAA2B,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;AAGhE,SAAS;AACT,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE/B,MAAM,UAAU,YAAY;IAC1B,SAAS;IACT,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;GAeP,CAAC,CAAC;IAEH,oCAAoC;IACpC,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,aAAa;IACf,CAAC;IAED,MAAM;IACN,EAAE,CAAC,IAAI,CAAC;;;;;;;;;GASP,CAAC,CAAC;IAEH,SAAS;IACT,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;GAWP,CAAC,CAAC;IAEH,OAAO;IACP,EAAE,CAAC,IAAI,CAAC;;;;GAIP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -3,6 +3,7 @@ export interface BrowserProfile {
|
|
|
3
3
|
executable_path: string;
|
|
4
4
|
fingerprint_path?: string;
|
|
5
5
|
storage_state_path?: string;
|
|
6
|
+
user_data_dir?: string;
|
|
6
7
|
description?: string;
|
|
7
8
|
proxy_server?: string;
|
|
8
9
|
proxy_username?: string;
|
|
@@ -18,4 +19,5 @@ export declare class ProfileRepository {
|
|
|
18
19
|
update(alias: string, updates: Partial<BrowserProfile>): void;
|
|
19
20
|
delete(alias: string): void;
|
|
20
21
|
updateLastUsed(alias: string): void;
|
|
22
|
+
updateUserDataDir(alias: string, userDataDir: string): void;
|
|
21
23
|
}
|
|
@@ -12,11 +12,11 @@ export class ProfileRepository {
|
|
|
12
12
|
create(profile) {
|
|
13
13
|
const stmt = db.prepare(`
|
|
14
14
|
INSERT INTO browser_profiles (
|
|
15
|
-
alias, executable_path, fingerprint_path, storage_state_path,
|
|
15
|
+
alias, executable_path, fingerprint_path, storage_state_path, user_data_dir,
|
|
16
16
|
description, proxy_server, proxy_username, proxy_password, proxy_bypass
|
|
17
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
17
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
18
18
|
`);
|
|
19
|
-
stmt.run(profile.alias, profile.executable_path, profile.fingerprint_path || null, profile.storage_state_path || null, profile.description || null, profile.proxy_server || null, profile.proxy_username || null, profile.proxy_password || null, profile.proxy_bypass || null);
|
|
19
|
+
stmt.run(profile.alias, profile.executable_path, profile.fingerprint_path || null, profile.storage_state_path || null, profile.user_data_dir || null, profile.storage_state_path || null, profile.description || null, profile.proxy_server || null, profile.proxy_username || null, profile.proxy_password || null, profile.proxy_bypass || null);
|
|
20
20
|
}
|
|
21
21
|
update(alias, updates) {
|
|
22
22
|
const fields = [];
|
|
@@ -38,5 +38,8 @@ export class ProfileRepository {
|
|
|
38
38
|
updateLastUsed(alias) {
|
|
39
39
|
db.prepare("UPDATE browser_profiles SET last_used = datetime('now') WHERE alias = ?").run(alias);
|
|
40
40
|
}
|
|
41
|
+
updateUserDataDir(alias, userDataDir) {
|
|
42
|
+
db.prepare('UPDATE browser_profiles SET user_data_dir = ? WHERE alias = ?').run(userDataDir, alias);
|
|
43
|
+
}
|
|
41
44
|
}
|
|
42
45
|
//# sourceMappingURL=profile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../src/db/repositories/profile.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../src/db/repositories/profile.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAiBpC,MAAM,OAAO,iBAAiB;IAC5B,MAAM;QACJ,OAAO,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,EAAsB,CAAC;IAChF,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,OAAO,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,KAAK,CAA+B,CAAC;IAC/G,CAAC;IAED,MAAM,CAAC,OAAyD;QAC9D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;KAKvB,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACN,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,gBAAgB,IAAI,IAAI,EAChC,OAAO,CAAC,kBAAkB,IAAI,IAAI,EAClC,OAAO,CAAC,aAAa,IAAI,IAAI,EAC7B,OAAO,CAAC,kBAAkB,IAAI,IAAI,EAClC,OAAO,CAAC,WAAW,IAAI,IAAI,EAC3B,OAAO,CAAC,YAAY,IAAI,IAAI,EAC5B,OAAO,CAAC,cAAc,IAAI,IAAI,EAC9B,OAAO,CAAC,cAAc,IAAI,IAAI,EAC9B,OAAO,CAAC,YAAY,IAAI,IAAI,CAC7B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,OAAgC;QACpD,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,EAAE,CAAC;QAElB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEhC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,EAAE,CAAC,OAAO,CAAC,+BAA+B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,EAAE,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnG,CAAC;IAED,iBAAiB,CAAC,KAAa,EAAE,WAAmB;QAClD,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACtG,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -13,8 +13,8 @@ import { instanceTools, setManager as setInstanceManager } from './tools/instanc
|
|
|
13
13
|
import { PlaywrightMCPProxy } from './tools/playwright-mcp-proxy.js';
|
|
14
14
|
// 初始化数据库
|
|
15
15
|
initDatabase();
|
|
16
|
-
// 创建 Playwright
|
|
17
|
-
const manager = new PlaywrightManager();
|
|
16
|
+
// 创建 Playwright 管理器并导出(供 playwright-mcp-proxy 访问)
|
|
17
|
+
export const manager = new PlaywrightManager();
|
|
18
18
|
setInstanceManager(manager);
|
|
19
19
|
// 创建 Playwright MCP 代理并导出为全局变量(供 switch_browser_instance 使用)
|
|
20
20
|
export const playwrightMCPProxy = new PlaywrightMCPProxy(async () => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,UAAU,IAAI,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,SAAS;AACT,YAAY,EAAE,CAAC;AAEf,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,8 @@ import { AccountRepository } from '../db/repositories/account.js';
|
|
|
8
8
|
import fs from 'fs/promises';
|
|
9
9
|
import path from 'path';
|
|
10
10
|
import os from 'os';
|
|
11
|
+
// 用户数据目录,与数据库在同一位置
|
|
12
|
+
const USER_DATA_BASE_DIR = path.join(os.homedir(), '.botbrowser-mcp', 'user-data');
|
|
11
13
|
export class PlaywrightManager {
|
|
12
14
|
instances = new Map();
|
|
13
15
|
profileRepo = new ProfileRepository();
|
|
@@ -21,6 +23,11 @@ export class PlaywrightManager {
|
|
|
21
23
|
if (!profile) {
|
|
22
24
|
throw new Error(`浏览器配置不存在: ${profileAlias}`);
|
|
23
25
|
}
|
|
26
|
+
// 检查该 profile 是否已有运行中的实例(同一指纹不能多开)
|
|
27
|
+
const existingInstance = Array.from(this.instances.values()).find(inst => inst.profileAlias === profileAlias);
|
|
28
|
+
if (existingInstance) {
|
|
29
|
+
throw new Error(`Profile "${profileAlias}" already has a running instance (ID: ${existingInstance.id}). Cannot launch multiple instances with the same fingerprint.`);
|
|
30
|
+
}
|
|
24
31
|
// 验证账号
|
|
25
32
|
if (accountId) {
|
|
26
33
|
const account = this.accountRepo.getById(accountId);
|
|
@@ -28,10 +35,18 @@ export class PlaywrightManager {
|
|
|
28
35
|
throw new Error(`账号 ${accountId} 不属于配置 ${profileAlias}`);
|
|
29
36
|
}
|
|
30
37
|
}
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
38
|
+
// 使用固定的 userDataDir(每个 profile 一个目录)
|
|
39
|
+
let userDataDir = profile.user_data_dir;
|
|
40
|
+
// 如果数据库中没有 userDataDir,创建并保存
|
|
41
|
+
if (!userDataDir) {
|
|
42
|
+
userDataDir = path.join(USER_DATA_BASE_DIR, profileAlias);
|
|
43
|
+
await fs.mkdir(USER_DATA_BASE_DIR, { recursive: true });
|
|
44
|
+
this.profileRepo.updateUserDataDir(profileAlias, userDataDir);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// 确保目录的父目录存在
|
|
48
|
+
await fs.mkdir(path.dirname(userDataDir), { recursive: true });
|
|
49
|
+
}
|
|
35
50
|
// 使用传入的 launchOptions,如果没有则使用默认值
|
|
36
51
|
const options = launchOptions || {};
|
|
37
52
|
// 确保有基本的 args 数组
|
|
@@ -129,13 +144,7 @@ export class PlaywrightManager {
|
|
|
129
144
|
}
|
|
130
145
|
// 关闭浏览器
|
|
131
146
|
await instance.context.close();
|
|
132
|
-
//
|
|
133
|
-
try {
|
|
134
|
-
await fs.rm(instance.userDataDir, { recursive: true, force: true });
|
|
135
|
-
}
|
|
136
|
-
catch (err) {
|
|
137
|
-
console.error(`清理用户数据目录失败: ${instance.userDataDir}`, err);
|
|
138
|
-
}
|
|
147
|
+
// 注意:不再删除 userDataDir,保留以便下次使用
|
|
139
148
|
// 从内存和数据库删除
|
|
140
149
|
this.instances.delete(instanceId);
|
|
141
150
|
this.instanceRepo.delete(instanceId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/playwright/manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAA2B,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/playwright/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,13 +30,17 @@ export declare class PlaywrightMCPProxy {
|
|
|
30
30
|
private loadTools;
|
|
31
31
|
/**
|
|
32
32
|
* Get all tool definitions for MCP protocol
|
|
33
|
+
*
|
|
34
|
+
* Adds optional instance_id parameter to all browser tools,
|
|
35
|
+
* allowing AI agents to directly specify which browser instance to operate on.
|
|
33
36
|
*/
|
|
34
37
|
getToolDefinitions(): Record<string, any>;
|
|
35
38
|
/**
|
|
36
39
|
* Call a Playwright MCP tool
|
|
37
40
|
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
41
|
+
* If instance_id is provided in args, temporarily switches to that instance,
|
|
42
|
+
* executes the tool, then restores the previous active instance.
|
|
43
|
+
* This allows AI agents to specify which browser to operate on directly.
|
|
40
44
|
*/
|
|
41
45
|
callTool(name: string, args: any): Promise<any>;
|
|
42
46
|
/**
|
|
@@ -130,13 +130,26 @@ export class PlaywrightMCPProxy {
|
|
|
130
130
|
}
|
|
131
131
|
/**
|
|
132
132
|
* Get all tool definitions for MCP protocol
|
|
133
|
+
*
|
|
134
|
+
* Adds optional instance_id parameter to all browser tools,
|
|
135
|
+
* allowing AI agents to directly specify which browser instance to operate on.
|
|
133
136
|
*/
|
|
134
137
|
getToolDefinitions() {
|
|
135
138
|
const handlers = {};
|
|
136
139
|
for (const [name, tool] of this.tools) {
|
|
140
|
+
// Clone the original inputSchema and add instance_id parameter
|
|
141
|
+
const enhancedSchema = JSON.parse(JSON.stringify(tool.inputSchema || {}));
|
|
142
|
+
if (!enhancedSchema.properties) {
|
|
143
|
+
enhancedSchema.properties = {};
|
|
144
|
+
}
|
|
145
|
+
// Add instance_id parameter to all browser tools
|
|
146
|
+
enhancedSchema.properties.instance_id = {
|
|
147
|
+
type: 'number',
|
|
148
|
+
description: 'Optional browser instance ID to operate on. If not specified, uses the currently active instance. Use list_browser_instances to see available instances.'
|
|
149
|
+
};
|
|
137
150
|
handlers[name] = {
|
|
138
|
-
description: tool.description
|
|
139
|
-
inputSchema:
|
|
151
|
+
description: `${tool.description} (Supports multi-instance via instance_id parameter)`,
|
|
152
|
+
inputSchema: enhancedSchema,
|
|
140
153
|
handler: async (args) => {
|
|
141
154
|
return await this.callTool(name, args);
|
|
142
155
|
}
|
|
@@ -147,8 +160,9 @@ export class PlaywrightMCPProxy {
|
|
|
147
160
|
/**
|
|
148
161
|
* Call a Playwright MCP tool
|
|
149
162
|
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
163
|
+
* If instance_id is provided in args, temporarily switches to that instance,
|
|
164
|
+
* executes the tool, then restores the previous active instance.
|
|
165
|
+
* This allows AI agents to specify which browser to operate on directly.
|
|
152
166
|
*/
|
|
153
167
|
async callTool(name, args) {
|
|
154
168
|
if (!this.mcpServer) {
|
|
@@ -157,18 +171,41 @@ export class PlaywrightMCPProxy {
|
|
|
157
171
|
if (!this.tools.has(name)) {
|
|
158
172
|
throw new Error(`Unknown Playwright tool: ${name}`);
|
|
159
173
|
}
|
|
174
|
+
// Extract instance_id if provided
|
|
175
|
+
const { instance_id, ...toolArgs } = args || {};
|
|
176
|
+
let previousInstanceId = null;
|
|
177
|
+
let needsRestore = false;
|
|
160
178
|
try {
|
|
179
|
+
// If instance_id is specified, temporarily switch to that instance
|
|
180
|
+
if (instance_id !== undefined) {
|
|
181
|
+
const { PlaywrightManager } = await import('../playwright/manager.js');
|
|
182
|
+
const { manager } = await import('../index.js');
|
|
183
|
+
if (manager) {
|
|
184
|
+
// Save current active instance
|
|
185
|
+
const instances = manager.listInstances();
|
|
186
|
+
const currentActive = instances.find((i) => i.is_active);
|
|
187
|
+
if (currentActive) {
|
|
188
|
+
previousInstanceId = currentActive.id;
|
|
189
|
+
}
|
|
190
|
+
// Switch to specified instance
|
|
191
|
+
if (previousInstanceId !== instance_id) {
|
|
192
|
+
await manager.switchActive(instance_id);
|
|
193
|
+
await this.resetContext();
|
|
194
|
+
needsRestore = true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
161
198
|
// Get the tools/call handler
|
|
162
199
|
const handler = this.mcpServer['_requestHandlers'].get('tools/call');
|
|
163
200
|
if (!handler) {
|
|
164
201
|
throw new Error('tools/call handler not found in MCP server');
|
|
165
202
|
}
|
|
166
|
-
// Call the tool with our arguments
|
|
203
|
+
// Call the tool with our arguments (without instance_id)
|
|
167
204
|
const result = await handler({
|
|
168
205
|
method: 'tools/call',
|
|
169
206
|
params: {
|
|
170
207
|
name,
|
|
171
|
-
arguments:
|
|
208
|
+
arguments: toolArgs
|
|
172
209
|
}
|
|
173
210
|
}, {});
|
|
174
211
|
return result;
|
|
@@ -177,6 +214,21 @@ export class PlaywrightMCPProxy {
|
|
|
177
214
|
console.error(`Playwright tool '${name}' failed:`, error);
|
|
178
215
|
throw error;
|
|
179
216
|
}
|
|
217
|
+
finally {
|
|
218
|
+
// Restore previous active instance if we switched
|
|
219
|
+
if (needsRestore && previousInstanceId !== null) {
|
|
220
|
+
try {
|
|
221
|
+
const { manager } = await import('../index.js');
|
|
222
|
+
if (manager) {
|
|
223
|
+
await manager.switchActive(previousInstanceId);
|
|
224
|
+
await this.resetContext();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
console.error('Failed to restore previous instance:', error);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
180
232
|
}
|
|
181
233
|
/**
|
|
182
234
|
* Check if a tool exists
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright-mcp-proxy.js","sourceRoot":"","sources":["../../src/tools/playwright-mcp-proxy.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"playwright-mcp-proxy.js","sourceRoot":"","sources":["../../src/tools/playwright-mcp-proxy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
多实例浏览器自动化 MCP Server,集成 [@playwright/mcp](https://www.npmjs.com/package/@playwright/mcp) 的 22 个浏览器工具,支持配置管理、账号管理和多实例切换。
|
|
4
4
|
|
|
5
|
-
**版本:** v0.1.
|
|
5
|
+
**版本:** v0.1.9
|
|
6
|
+
**平台:** Windows | Linux | macOS
|
|
7
|
+
|
|
8
|
+
> 📖 查看 [平台兼容性说明](PLATFORM_COMPATIBILITY.md) 了解不同平台的配置差异
|
|
6
9
|
|
|
7
10
|
## 安装
|
|
8
11
|
|
|
@@ -43,8 +46,10 @@ npm install -g botbrowser-mcp
|
|
|
43
46
|
|
|
44
47
|
1. **浏览器配置 (Profile)** - 定义浏览器启动参数
|
|
45
48
|
- Chrome 可执行文件路径
|
|
46
|
-
- Cookie/LocalStorage
|
|
49
|
+
- Cookie/LocalStorage 存储路径(可选)
|
|
50
|
+
- 用户数据目录(自动管理,存储缓存/扩展/设置等)
|
|
47
51
|
- 代理设置
|
|
52
|
+
- **限制:同一 Profile 同时只能启动一个实例**
|
|
48
53
|
|
|
49
54
|
2. **账号 (Account)** - 绑定到配置的用户账号
|
|
50
55
|
- 平台标识(twitter, github 等)
|
|
@@ -54,6 +59,7 @@ npm install -g botbrowser-mcp
|
|
|
54
59
|
- 基于某个配置启动
|
|
55
60
|
- 可选关联某个账号
|
|
56
61
|
- 同时只有一个实例为活跃状态
|
|
62
|
+
- 复用配置的 userDataDir(保留浏览器状态)
|
|
57
63
|
|
|
58
64
|
## 快速开始
|
|
59
65
|
|
|
@@ -63,7 +69,12 @@ npm install -g botbrowser-mcp
|
|
|
63
69
|
# 1. 创建浏览器配置
|
|
64
70
|
create_browser_profile(
|
|
65
71
|
alias: "twitter-bot",
|
|
66
|
-
|
|
72
|
+
# Windows 路径示例
|
|
73
|
+
executable_path: "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
|
|
74
|
+
# Linux 路径示例
|
|
75
|
+
# executable_path: "/usr/bin/google-chrome",
|
|
76
|
+
# macOS 路径示例
|
|
77
|
+
# executable_path: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
67
78
|
storage_state_path: "/Users/me/.botbrowser/twitter_cookies.json"
|
|
68
79
|
)
|
|
69
80
|
|
|
@@ -78,16 +89,40 @@ add_account(
|
|
|
78
89
|
|
|
79
90
|
# 3. 启动浏览器(自动成为活跃实例)
|
|
80
91
|
launch_browser(profile_alias: "twitter-bot", account_id: 1)
|
|
92
|
+
# 返回: Browser instance 1 launched successfully
|
|
81
93
|
|
|
82
|
-
# 4.
|
|
94
|
+
# 4. 方式1:使用活跃实例(传统方式)
|
|
83
95
|
browser_navigate(url: "https://twitter.com")
|
|
84
96
|
browser_click(element: "登录按钮")
|
|
85
97
|
|
|
86
98
|
# 5. 启动第二个实例
|
|
87
99
|
launch_browser(profile_alias: "twitter-bot", account_id: 2)
|
|
100
|
+
# 返回: Browser instance 2 launched successfully
|
|
101
|
+
|
|
102
|
+
# 6. 方式2:直接指定实例ID(推荐!)
|
|
103
|
+
browser_navigate(url: "https://twitter.com", instance_id: 1) # 在实例1操作
|
|
104
|
+
browser_navigate(url: "https://facebook.com", instance_id: 2) # 在实例2操作
|
|
88
105
|
|
|
89
|
-
#
|
|
106
|
+
# 7. 方式3:切换活跃实例再操作
|
|
90
107
|
switch_browser_instance(instance_id: 1)
|
|
108
|
+
browser_click(element: "Tweet按钮") # 自动使用实例1
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 多实例操作的两种方式
|
|
112
|
+
|
|
113
|
+
**方式1: 显式指定 instance_id(推荐)**
|
|
114
|
+
```
|
|
115
|
+
# 所有浏览器工具都支持 instance_id 参数
|
|
116
|
+
browser_navigate(url: "https://example.com", instance_id: 1)
|
|
117
|
+
browser_click(element: "按钮", ref: "abc123", instance_id: 2)
|
|
118
|
+
browser_type(element: "输入框", ref: "xyz", text: "hello", instance_id: 1)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**方式2: 切换活跃实例**
|
|
122
|
+
```
|
|
123
|
+
switch_browser_instance(instance_id: 1)
|
|
124
|
+
browser_navigate(url: "https://example.com") # 使用实例1
|
|
125
|
+
browser_click(element: "按钮") # 使用实例1
|
|
91
126
|
```
|
|
92
127
|
|
|
93
128
|
## 可用工具 (36个)
|
|
@@ -113,6 +148,9 @@ switch_browser_instance(instance_id: 1)
|
|
|
113
148
|
- `cleanup_orphaned_instances` - 清理孤立记录
|
|
114
149
|
|
|
115
150
|
### 浏览器操作 (22个 - 来自 @playwright/mcp)
|
|
151
|
+
|
|
152
|
+
**所有浏览器工具都支持可选的 `instance_id` 参数,可直接指定要操作的浏览器实例**
|
|
153
|
+
|
|
116
154
|
- `browser_navigate` - 导航到 URL
|
|
117
155
|
- `browser_click` - 点击元素
|
|
118
156
|
- `browser_type` - 输入文本
|
|
@@ -192,11 +230,22 @@ switch_browser_instance(instance_id: 1)
|
|
|
192
230
|
- **动态上下文切换**: 使用 `PlaywrightMCPProxy` 包装 @playwright/mcp,通过 `resetContext()` 清除缓存
|
|
193
231
|
- **独立浏览器状态**: 每个实例维护独立的页面、会话和导航历史
|
|
194
232
|
- **完整配置支持**: 提供包含超时设置的完整 BrowserServerBackend 配置
|
|
233
|
+
- **直接实例指定**: 所有浏览器工具支持 `instance_id` 参数,无需切换即可操作指定实例
|
|
195
234
|
|
|
196
235
|
**工作原理:**
|
|
197
|
-
1.
|
|
198
|
-
2.
|
|
199
|
-
3.
|
|
236
|
+
1. AI Agent 调用浏览器工具时,可选提供 `instance_id` 参数
|
|
237
|
+
2. 如果提供了 `instance_id`,临时切换到该实例
|
|
238
|
+
3. 执行工具操作后,自动恢复到之前的活跃实例
|
|
239
|
+
4. 如果未提供 `instance_id`,使用当前活跃实例
|
|
240
|
+
|
|
241
|
+
**示例:**
|
|
242
|
+
```javascript
|
|
243
|
+
// 同时操作两个浏览器实例,无需显式切换
|
|
244
|
+
await browser_navigate({ url: "https://twitter.com", instance_id: 1 });
|
|
245
|
+
await browser_navigate({ url: "https://facebook.com", instance_id: 2 });
|
|
246
|
+
await browser_click({ element: "Tweet按钮", ref: "xyz", instance_id: 1 });
|
|
247
|
+
await browser_click({ element: "Post按钮", ref: "abc", instance_id: 2 });
|
|
248
|
+
```
|
|
200
249
|
|
|
201
250
|
### 元数据字段
|
|
202
251
|
|
|
@@ -213,19 +262,45 @@ metadata: '{"password":"abc123","2fa":"JBSWY3DP","recovery":["c1","c2"]}'
|
|
|
213
262
|
metadata: "密码是 abc123,双因素认证是 JBSWY3DP,备用邮箱 backup@gmail.com"
|
|
214
263
|
```
|
|
215
264
|
|
|
265
|
+
### 用户数据目录管理
|
|
266
|
+
|
|
267
|
+
**自动管理:**
|
|
268
|
+
- 每个 Profile 使用固定的 userDataDir: `~/.botbrowser-mcp/user-data/{profile_alias}/`
|
|
269
|
+
- 首次启动自动创建并存储到数据库
|
|
270
|
+
- 停止实例时**不会删除** userDataDir,下次启动继续使用
|
|
271
|
+
- 保留浏览器缓存、扩展、网站数据、会话等
|
|
272
|
+
|
|
273
|
+
**双重状态保存:**
|
|
274
|
+
1. **userDataDir** - 完整的浏览器状态(缓存、扩展、设置等)
|
|
275
|
+
2. **storage_state_path** (可选) - 仅保存 Cookies 和 LocalStorage
|
|
276
|
+
|
|
277
|
+
**多开限制:**
|
|
278
|
+
- 同一 Profile 不能同时启动多个实例(Playwright 限制)
|
|
279
|
+
- 需要多开请创建多个 Profile(可使用相同的 executable_path)
|
|
280
|
+
|
|
216
281
|
## 数据存储
|
|
217
282
|
|
|
218
|
-
所有数据存储在: `~/.botbrowser-mcp
|
|
283
|
+
所有数据存储在: `~/.botbrowser-mcp/`
|
|
284
|
+
|
|
285
|
+
**目录结构:**
|
|
286
|
+
```
|
|
287
|
+
~/.botbrowser-mcp/
|
|
288
|
+
├── botbrowser.db # SQLite 数据库
|
|
289
|
+
└── user-data/ # 浏览器用户数据目录
|
|
290
|
+
├── twitter-bot/ # Profile: twitter-bot
|
|
291
|
+
├── work-profile/ # Profile: work-profile
|
|
292
|
+
└── personal/ # Profile: personal
|
|
293
|
+
```
|
|
219
294
|
|
|
220
295
|
**数据库表:**
|
|
221
|
-
- `browser_profiles` -
|
|
296
|
+
- `browser_profiles` - 浏览器配置(包含 user_data_dir)
|
|
222
297
|
- `accounts` - 账号信息
|
|
223
298
|
- `browser_instances` - 运行中的实例
|
|
224
299
|
|
|
225
300
|
可使用 SQLite 客户端查看:
|
|
226
301
|
```bash
|
|
227
302
|
sqlite3 ~/.botbrowser-mcp/botbrowser.db
|
|
228
|
-
SELECT
|
|
303
|
+
SELECT alias, user_data_dir FROM browser_profiles;
|
|
229
304
|
```
|
|
230
305
|
|
|
231
306
|
## 常见问题
|
|
@@ -234,10 +309,32 @@ SELECT * FROM browser_profiles;
|
|
|
234
309
|
A: 使用 `list_browser_instances` 查看,`is_active: 1` 的实例就是当前活跃实例。
|
|
235
310
|
|
|
236
311
|
**Q: 可以同时操作多个实例吗?**
|
|
237
|
-
A:
|
|
312
|
+
A: 可以!有两种方式:
|
|
313
|
+
1. 在每个工具调用时指定 `instance_id` 参数(推荐)
|
|
314
|
+
2. 使用 `switch_browser_instance` 切换活跃实例
|
|
315
|
+
|
|
316
|
+
**Q: 为什么同一个 Profile 不能多开?**
|
|
317
|
+
A: Playwright 的 `launchPersistentContext` 会锁定 userDataDir,同一目录只能被一个实例使用。如需多开,请创建多个 Profile。
|
|
318
|
+
|
|
319
|
+
**Q: 如何实现多账号同时登录?**
|
|
320
|
+
A: 为每个账号创建独立的 Profile:
|
|
321
|
+
```
|
|
322
|
+
create_browser_profile(alias: "twitter-account1", ...)
|
|
323
|
+
create_browser_profile(alias: "twitter-account2", ...)
|
|
324
|
+
launch_browser(profile_alias: "twitter-account1")
|
|
325
|
+
launch_browser(profile_alias: "twitter-account2")
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**Q: userDataDir 什么时候清理?**
|
|
329
|
+
A: 不会自动清理。停止实例时保留 userDataDir 以便下次使用。如需清理,手动删除 `~/.botbrowser-mcp/user-data/{profile}/`。
|
|
238
330
|
|
|
239
331
|
**Q: Cookie 什么时候保存?**
|
|
240
|
-
A:
|
|
332
|
+
A:
|
|
333
|
+
- userDataDir 中的数据实时保存
|
|
334
|
+
- storage_state_path(如果配置)在停止实例时保存
|
|
335
|
+
|
|
336
|
+
**Q: 什么时候需要使用 instance_id 参数?**
|
|
337
|
+
A: 当你需要频繁在多个浏览器之间切换操作时,使用 `instance_id` 更方便,避免反复调用 `switch_browser_instance`。
|
|
241
338
|
|
|
242
339
|
**Q: 孤立实例记录是什么?**
|
|
243
340
|
A: 如果程序异常退出,浏览器已关闭但数据库记录还在,使用 `cleanup_orphaned_instances` 清理。
|