botbrowser-mcp 0.1.5 → 0.1.7
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 +10 -16
- package/dist/db/database.js.map +1 -1
- package/dist/db/repositories/profile.d.ts +2 -2
- package/dist/db/repositories/profile.js +1 -1
- package/dist/db/repositories/profile.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +28 -9
- package/dist/index.js.map +1 -1
- package/dist/playwright/manager.d.ts +1 -1
- package/dist/playwright/manager.js +58 -28
- package/dist/playwright/manager.js.map +1 -1
- package/dist/tools/instance.d.ts +5 -0
- package/dist/tools/instance.js +12 -1
- package/dist/tools/instance.js.map +1 -1
- package/dist/tools/playwright-mcp-proxy.d.ts +63 -0
- package/dist/tools/playwright-mcp-proxy.js +229 -0
- package/dist/tools/playwright-mcp-proxy.js.map +1 -0
- package/dist/tools/profile.js +3 -3
- package/dist/tools/profile.js.map +1 -1
- package/package.json +5 -5
- package/readme.md +226 -12
- package/dist/cli.d.ts +0 -5
- package/dist/cli.js +0 -13
- package/dist/cli.js.map +0 -1
- package/dist/tools/browser.d.ts +0 -178
- package/dist/tools/browser.js +0 -211
- package/dist/tools/browser.js.map +0 -1
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
// Create a require function for loading CommonJS modules in ES modules
|
|
3
|
+
const require = createRequire(import.meta.url);
|
|
4
|
+
/**
|
|
5
|
+
* Dynamic Browser Context Factory
|
|
6
|
+
*
|
|
7
|
+
* Ensures Playwright MCP always gets the current active context,
|
|
8
|
+
* not a cached one from initialization time.
|
|
9
|
+
*/
|
|
10
|
+
class DynamicBrowserContextFactory {
|
|
11
|
+
name = 'dynamic-multi-instance';
|
|
12
|
+
description = 'Dynamically provides the current active browser context for multi-instance support';
|
|
13
|
+
contextGetter;
|
|
14
|
+
constructor(contextGetter) {
|
|
15
|
+
this.contextGetter = contextGetter;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Called by Playwright MCP Context class every time it needs a browser context
|
|
19
|
+
* This is invoked via _ensureBrowserContext() which happens on every tool call
|
|
20
|
+
*/
|
|
21
|
+
async createContext() {
|
|
22
|
+
// Get the CURRENT active context
|
|
23
|
+
const browserContext = await this.contextGetter();
|
|
24
|
+
return {
|
|
25
|
+
browserContext,
|
|
26
|
+
// Don't close - lifecycle managed externally by PlaywrightManager
|
|
27
|
+
close: async () => {
|
|
28
|
+
// No-op: we manage context lifecycle in our manager
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class PlaywrightMCPProxy {
|
|
34
|
+
mcpServer = null;
|
|
35
|
+
backend = null; // BrowserServerBackend instance
|
|
36
|
+
contextGetter;
|
|
37
|
+
factory;
|
|
38
|
+
tools = new Map();
|
|
39
|
+
constructor(contextGetter) {
|
|
40
|
+
this.contextGetter = contextGetter;
|
|
41
|
+
this.factory = new DynamicBrowserContextFactory(contextGetter);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Initialize the MCP connection with our dynamic context factory
|
|
45
|
+
*
|
|
46
|
+
* We directly use Playwright MCP's internal modules to inject our
|
|
47
|
+
* custom factory, bypassing the createConnection() helper which
|
|
48
|
+
* doesn't support dynamic context switching.
|
|
49
|
+
*/
|
|
50
|
+
async initialize() {
|
|
51
|
+
try {
|
|
52
|
+
// Use file paths to load internal modules (bypassing package exports restrictions)
|
|
53
|
+
const playwrightMcpPath = require.resolve('@playwright/mcp');
|
|
54
|
+
const playwrightMcpDir = playwrightMcpPath.substring(0, playwrightMcpPath.lastIndexOf('/'));
|
|
55
|
+
const { BrowserServerBackend } = require(`${playwrightMcpDir}/node_modules/playwright/lib/mcp/browser/browserServerBackend`);
|
|
56
|
+
const mcpServer = require(`${playwrightMcpDir}/node_modules/playwright/lib/mcp/sdk/server`);
|
|
57
|
+
const packageJSON = require(`${playwrightMcpDir}/package.json`);
|
|
58
|
+
// Create backend with our dynamic factory
|
|
59
|
+
// Provide a minimal config matching Playwright MCP's defaultConfig structure
|
|
60
|
+
const config = {
|
|
61
|
+
browser: {
|
|
62
|
+
browserName: 'chromium',
|
|
63
|
+
launchOptions: {
|
|
64
|
+
channel: 'chrome',
|
|
65
|
+
headless: false,
|
|
66
|
+
chromiumSandbox: true
|
|
67
|
+
},
|
|
68
|
+
contextOptions: {
|
|
69
|
+
viewport: null
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
console: {
|
|
73
|
+
level: 'info'
|
|
74
|
+
},
|
|
75
|
+
network: {
|
|
76
|
+
allowedOrigins: undefined,
|
|
77
|
+
blockedOrigins: undefined
|
|
78
|
+
},
|
|
79
|
+
server: {},
|
|
80
|
+
saveTrace: false,
|
|
81
|
+
snapshot: {
|
|
82
|
+
mode: 'incremental'
|
|
83
|
+
},
|
|
84
|
+
timeouts: {
|
|
85
|
+
action: 5000,
|
|
86
|
+
navigation: 60000
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
this.backend = new BrowserServerBackend(config, this.factory);
|
|
90
|
+
// Create the MCP server
|
|
91
|
+
this.mcpServer = mcpServer.createServer('Playwright', packageJSON.version, this.backend, false);
|
|
92
|
+
// Load all available tools
|
|
93
|
+
await this.loadTools();
|
|
94
|
+
console.error('[PlaywrightMCPProxy] Initialized with dynamic multi-instance support');
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.error('[PlaywrightMCPProxy] Initialization failed:', error);
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Load all tool definitions from Playwright MCP
|
|
103
|
+
*/
|
|
104
|
+
async loadTools() {
|
|
105
|
+
if (!this.mcpServer) {
|
|
106
|
+
throw new Error('MCP Server not initialized');
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
// Get the tools/list handler from the MCP server
|
|
110
|
+
const handler = this.mcpServer['_requestHandlers'].get('tools/list');
|
|
111
|
+
if (!handler) {
|
|
112
|
+
throw new Error('tools/list handler not found in MCP server');
|
|
113
|
+
}
|
|
114
|
+
// Call the handler to get all tools
|
|
115
|
+
const result = await handler({
|
|
116
|
+
method: 'tools/list',
|
|
117
|
+
params: {}
|
|
118
|
+
}, {});
|
|
119
|
+
// Store tools in our map
|
|
120
|
+
if (result && result.tools) {
|
|
121
|
+
for (const tool of result.tools) {
|
|
122
|
+
this.tools.set(tool.name, tool);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
console.error('Failed to load Playwright tools:', error);
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get all tool definitions for MCP protocol
|
|
133
|
+
*/
|
|
134
|
+
getToolDefinitions() {
|
|
135
|
+
const handlers = {};
|
|
136
|
+
for (const [name, tool] of this.tools) {
|
|
137
|
+
handlers[name] = {
|
|
138
|
+
description: tool.description,
|
|
139
|
+
inputSchema: tool.inputSchema,
|
|
140
|
+
handler: async (args) => {
|
|
141
|
+
return await this.callTool(name, args);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
return handlers;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Call a Playwright MCP tool
|
|
149
|
+
*
|
|
150
|
+
* Each call will use the CURRENT active browser context thanks to our
|
|
151
|
+
* dynamic factory, enabling proper multi-instance support.
|
|
152
|
+
*/
|
|
153
|
+
async callTool(name, args) {
|
|
154
|
+
if (!this.mcpServer) {
|
|
155
|
+
throw new Error('MCP Server not initialized');
|
|
156
|
+
}
|
|
157
|
+
if (!this.tools.has(name)) {
|
|
158
|
+
throw new Error(`Unknown Playwright tool: ${name}`);
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
// Get the tools/call handler
|
|
162
|
+
const handler = this.mcpServer['_requestHandlers'].get('tools/call');
|
|
163
|
+
if (!handler) {
|
|
164
|
+
throw new Error('tools/call handler not found in MCP server');
|
|
165
|
+
}
|
|
166
|
+
// Call the tool with our arguments
|
|
167
|
+
const result = await handler({
|
|
168
|
+
method: 'tools/call',
|
|
169
|
+
params: {
|
|
170
|
+
name,
|
|
171
|
+
arguments: args || {}
|
|
172
|
+
}
|
|
173
|
+
}, {});
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error(`Playwright tool '${name}' failed:`, error);
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Check if a tool exists
|
|
183
|
+
*/
|
|
184
|
+
hasTool(name) {
|
|
185
|
+
return this.tools.has(name);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get list of all tool names
|
|
189
|
+
*/
|
|
190
|
+
getToolNames() {
|
|
191
|
+
return Array.from(this.tools.keys());
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Reset the browser context cache
|
|
195
|
+
*
|
|
196
|
+
* This forces Playwright MCP's Context to clear its cached BrowserContext,
|
|
197
|
+
* so the next tool call will fetch the current active context from our factory.
|
|
198
|
+
*
|
|
199
|
+
* CRITICAL for multi-instance switching to work correctly.
|
|
200
|
+
*/
|
|
201
|
+
async resetContext() {
|
|
202
|
+
if (!this.backend || !this.backend._context) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
// Directly clear the cached promise without closing pages
|
|
207
|
+
// This is safer than calling closeBrowserContext() which closes pages
|
|
208
|
+
this.backend._context._browserContextPromise = undefined;
|
|
209
|
+
this.backend._context._tabs = [];
|
|
210
|
+
this.backend._context._currentTab = undefined;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
// Silently handle errors during context reset
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Close/cleanup the proxy
|
|
218
|
+
*/
|
|
219
|
+
async close() {
|
|
220
|
+
// Clean up if needed
|
|
221
|
+
if (this.backend && this.backend._context) {
|
|
222
|
+
await this.backend._context.dispose();
|
|
223
|
+
}
|
|
224
|
+
this.mcpServer = null;
|
|
225
|
+
this.backend = null;
|
|
226
|
+
this.tools.clear();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=playwright-mcp-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright-mcp-proxy.js","sourceRoot":"","sources":["../../src/tools/playwright-mcp-proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/profile.js
CHANGED
|
@@ -27,15 +27,15 @@ export const profileTools = {
|
|
|
27
27
|
properties: {
|
|
28
28
|
alias: { type: 'string', description: '配置别名(唯一标识)' },
|
|
29
29
|
executable_path: { type: 'string', description: 'Chrome 可执行文件路径' },
|
|
30
|
-
fingerprint_path: { type: 'string', description: '
|
|
31
|
-
storage_state_path: { type: 'string', description: 'Cookie/LocalStorage
|
|
30
|
+
fingerprint_path: { type: 'string', description: '防指纹配置文件路径(可选)' },
|
|
31
|
+
storage_state_path: { type: 'string', description: 'Cookie/LocalStorage 存储路径(可选,不指定则不保存状态)' },
|
|
32
32
|
description: { type: 'string', description: '配置描述' },
|
|
33
33
|
proxy_server: { type: 'string', description: '代理服务器地址' },
|
|
34
34
|
proxy_username: { type: 'string', description: '代理用户名' },
|
|
35
35
|
proxy_password: { type: 'string', description: '代理密码' },
|
|
36
36
|
proxy_bypass: { type: 'string', description: '代理绕过列表' },
|
|
37
37
|
},
|
|
38
|
-
required: ['alias', 'executable_path'
|
|
38
|
+
required: ['alias', 'executable_path'],
|
|
39
39
|
},
|
|
40
40
|
handler: async (args) => {
|
|
41
41
|
profileRepo.create(args);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/tools/profile.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAkB,MAAM,+BAA+B,CAAC;AAElF,MAAM,WAAW,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,qBAAqB,EAAE;QACrB,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;qBACxC,CAAC;aACH,CAAC;QACJ,CAAC;KACF;IAED,sBAAsB,EAAE;QACtB,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;gBACpD,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;gBAClE,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/tools/profile.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "botbrowser-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "Multi-instance browser automation MCP server with profile and account management",
|
|
5
5
|
"author": "tonwe",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -35,13 +35,13 @@
|
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
38
|
-
"playwright": "^
|
|
39
|
-
"better-sqlite3": "^11.0.0"
|
|
38
|
+
"@playwright/mcp": "^0.0.53",
|
|
39
|
+
"better-sqlite3": "^11.0.0",
|
|
40
|
+
"playwright": "^1.49.0"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
|
42
|
-
"@types/node": "^22.10.2",
|
|
43
43
|
"@types/better-sqlite3": "^7.6.11",
|
|
44
|
+
"@types/node": "^22.10.2",
|
|
44
45
|
"typescript": "^5.7.2"
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
|
-
|
package/readme.md
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
#
|
|
1
|
+
# BotBrowser MCP
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
多实例浏览器自动化 MCP Server,集成 [@playwright/mcp](https://www.npmjs.com/package/@playwright/mcp) 的 22 个浏览器工具,支持配置管理、账号管理和多实例切换。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**版本:** v0.1.6
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
6
8
|
|
|
7
9
|
```bash
|
|
8
10
|
npm install -g botbrowser-mcp
|
|
9
11
|
```
|
|
10
12
|
|
|
11
|
-
##
|
|
13
|
+
## 配置
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
在 MCP 客户端(如 Claude Desktop)的配置文件中添加:
|
|
14
16
|
|
|
15
17
|
```json
|
|
16
18
|
{
|
|
@@ -22,7 +24,7 @@ Add to your MCP client configuration (e.g., Claude Desktop config):
|
|
|
22
24
|
}
|
|
23
25
|
```
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
或使用 npx(无需安装):
|
|
26
28
|
|
|
27
29
|
```json
|
|
28
30
|
{
|
|
@@ -35,14 +37,226 @@ Or use with npx (no installation needed):
|
|
|
35
37
|
}
|
|
36
38
|
```
|
|
37
39
|
|
|
38
|
-
##
|
|
40
|
+
## 核心概念
|
|
41
|
+
|
|
42
|
+
### 三层数据模型
|
|
43
|
+
|
|
44
|
+
1. **浏览器配置 (Profile)** - 定义浏览器启动参数
|
|
45
|
+
- Chrome 可执行文件路径
|
|
46
|
+
- Cookie/LocalStorage 存储路径
|
|
47
|
+
- 代理设置
|
|
48
|
+
|
|
49
|
+
2. **账号 (Account)** - 绑定到配置的用户账号
|
|
50
|
+
- 平台标识(twitter, github 等)
|
|
51
|
+
- 用户名和元数据(密码、2FA 等)
|
|
52
|
+
|
|
53
|
+
3. **浏览器实例 (Instance)** - 运行中的浏览器
|
|
54
|
+
- 基于某个配置启动
|
|
55
|
+
- 可选关联某个账号
|
|
56
|
+
- 同时只有一个实例为活跃状态
|
|
57
|
+
|
|
58
|
+
## 快速开始
|
|
59
|
+
|
|
60
|
+
### 示例:管理多个 Twitter 账号
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
# 1. 创建浏览器配置
|
|
64
|
+
create_browser_profile(
|
|
65
|
+
alias: "twitter-bot",
|
|
66
|
+
executable_path: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
67
|
+
storage_state_path: "/Users/me/.botbrowser/twitter_cookies.json"
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# 2. 添加账号
|
|
71
|
+
add_account(
|
|
72
|
+
profile_alias: "twitter-bot",
|
|
73
|
+
platform: "twitter",
|
|
74
|
+
identifier: "account1",
|
|
75
|
+
username: "account1@twitter.com",
|
|
76
|
+
metadata: "password: SecurePass123"
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# 3. 启动浏览器(自动成为活跃实例)
|
|
80
|
+
launch_browser(profile_alias: "twitter-bot", account_id: 1)
|
|
81
|
+
|
|
82
|
+
# 4. 使用浏览器工具(自动作用于活跃实例)
|
|
83
|
+
browser_navigate(url: "https://twitter.com")
|
|
84
|
+
browser_click(element: "登录按钮")
|
|
85
|
+
|
|
86
|
+
# 5. 启动第二个实例
|
|
87
|
+
launch_browser(profile_alias: "twitter-bot", account_id: 2)
|
|
88
|
+
|
|
89
|
+
# 6. 切换回第一个实例
|
|
90
|
+
switch_browser_instance(instance_id: 1)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## 可用工具 (36个)
|
|
94
|
+
|
|
95
|
+
### 配置管理 (4个)
|
|
96
|
+
- `list_browser_profiles` - 列出所有配置
|
|
97
|
+
- `create_browser_profile` - 创建新配置
|
|
98
|
+
- `update_browser_profile` - 更新配置
|
|
99
|
+
- `delete_browser_profile` - 删除配置
|
|
100
|
+
|
|
101
|
+
### 账号管理 (5个)
|
|
102
|
+
- `add_account` - 添加账号
|
|
103
|
+
- `list_accounts` - 列出账号
|
|
104
|
+
- `find_account` - 查找账号
|
|
105
|
+
- `update_account` - 更新账号
|
|
106
|
+
- `delete_account` - 删除账号
|
|
107
|
+
|
|
108
|
+
### 实例管理 (5个)
|
|
109
|
+
- `launch_browser` - 启动浏览器
|
|
110
|
+
- `list_browser_instances` - 列出实例
|
|
111
|
+
- `switch_browser_instance` - 切换活跃实例
|
|
112
|
+
- `stop_browser_instance` - 停止实例
|
|
113
|
+
- `cleanup_orphaned_instances` - 清理孤立记录
|
|
114
|
+
|
|
115
|
+
### 浏览器操作 (22个 - 来自 @playwright/mcp)
|
|
116
|
+
- `browser_navigate` - 导航到 URL
|
|
117
|
+
- `browser_click` - 点击元素
|
|
118
|
+
- `browser_type` - 输入文本
|
|
119
|
+
- `browser_screenshot` - 截图
|
|
120
|
+
- `browser_evaluate` - 执行 JavaScript
|
|
121
|
+
- `browser_fill_form` - 批量填充表单
|
|
122
|
+
- `browser_select_option` - 选择下拉选项
|
|
123
|
+
- `browser_hover` - 鼠标悬停
|
|
124
|
+
- `browser_drag` - 拖拽操作
|
|
125
|
+
- `browser_handle_dialog` - 处理对话框
|
|
126
|
+
- `browser_file_upload` - 文件上传
|
|
127
|
+
- `browser_navigate_back` - 后退
|
|
128
|
+
- `browser_tabs` - 标签页管理
|
|
129
|
+
- `browser_wait_for` - 等待元素/文本/时间
|
|
130
|
+
- `browser_console_messages` - 获取控制台消息
|
|
131
|
+
- `browser_network_requests` - 获取网络请求
|
|
132
|
+
- `browser_run_code` - 执行 Playwright 代码片段
|
|
133
|
+
- `browser_close` - 关闭页面
|
|
134
|
+
- 其他高级操作工具...
|
|
135
|
+
|
|
136
|
+
## 架构
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
┌─────────────────────────────────────────┐
|
|
140
|
+
│ LLM Agent (Claude/Cursor) │
|
|
141
|
+
│ "启动 twitter-bot 的 account1" │
|
|
142
|
+
└────────────────┬────────────────────────┘
|
|
143
|
+
│ stdio (MCP Protocol)
|
|
144
|
+
↓
|
|
145
|
+
┌─────────────────────────────────────────┐
|
|
146
|
+
│ BotBrowser-MCP Server │
|
|
147
|
+
│ │
|
|
148
|
+
│ ┌─────────────────────────────────┐ │
|
|
149
|
+
│ │ 自定义工具 (14个) │ │
|
|
150
|
+
│ │ - 配置管理 (4) │ │
|
|
151
|
+
│ │ - 账号管理 (5) │ │
|
|
152
|
+
│ │ - 实例管理 (5) │ │
|
|
153
|
+
│ └─────────────────────────────────┘ │
|
|
154
|
+
│ │
|
|
155
|
+
│ ┌─────────────────────────────────┐ │
|
|
156
|
+
│ │ PlaywrightMCPProxy │ │
|
|
157
|
+
│ │ - 包装 @playwright/mcp │ │
|
|
158
|
+
│ │ - 动态上下文切换 │ │
|
|
159
|
+
│ │ - 浏览器工具 (22个) │ │
|
|
160
|
+
│ └─────────────────────────────────┘ │
|
|
161
|
+
│ │
|
|
162
|
+
│ ┌─────────────────────────────────┐ │
|
|
163
|
+
│ │ PlaywrightManager │ │
|
|
164
|
+
│ │ instances: Map { │ │
|
|
165
|
+
│ │ 1: { context, browser } │ │
|
|
166
|
+
│ │ 2: { context, browser } │ │
|
|
167
|
+
│ │ } │ │
|
|
168
|
+
│ │ activeInstanceId: 1 │ │
|
|
169
|
+
│ └─────────────────────────────────┘ │
|
|
170
|
+
│ │
|
|
171
|
+
│ ┌─────────────────────────────────┐ │
|
|
172
|
+
│ │ SQLite Database │ │
|
|
173
|
+
│ │ ~/.botbrowser-mcp/ │ │
|
|
174
|
+
│ │ - browser_profiles │ │
|
|
175
|
+
│ │ - accounts │ │
|
|
176
|
+
│ │ - browser_instances │ │
|
|
177
|
+
│ └─────────────────────────────────┘ │
|
|
178
|
+
└─────────────────────────────────────────┘
|
|
179
|
+
│
|
|
180
|
+
↓
|
|
181
|
+
┌────────────────────────────┐
|
|
182
|
+
│ 实际运行的浏览器 │
|
|
183
|
+
│ Instance 1: Chrome │
|
|
184
|
+
│ Instance 2: Chrome │
|
|
185
|
+
└────────────────────────────┘
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## 技术特性
|
|
189
|
+
|
|
190
|
+
### 多实例浏览器切换
|
|
191
|
+
|
|
192
|
+
- **动态上下文切换**: 使用 `PlaywrightMCPProxy` 包装 @playwright/mcp,通过 `resetContext()` 清除缓存
|
|
193
|
+
- **独立浏览器状态**: 每个实例维护独立的页面、会话和导航历史
|
|
194
|
+
- **完整配置支持**: 提供包含超时设置的完整 BrowserServerBackend 配置
|
|
195
|
+
|
|
196
|
+
**工作原理:**
|
|
197
|
+
1. @playwright/mcp 的 Context 类会缓存 BrowserContext
|
|
198
|
+
2. 调用 `switch_browser_instance` 后,清除 `_browserContextPromise` 缓存
|
|
199
|
+
3. 下次工具调用时,自动使用当前活跃实例的上下文
|
|
200
|
+
|
|
201
|
+
### 元数据字段
|
|
202
|
+
|
|
203
|
+
账号的 `metadata` 字段支持任意格式,LLM 可自由存取:
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
# 键值对格式
|
|
207
|
+
metadata: "password: abc123, 2fa: JBSWY3DP, email: backup@gmail.com"
|
|
208
|
+
|
|
209
|
+
# JSON 格式
|
|
210
|
+
metadata: '{"password":"abc123","2fa":"JBSWY3DP","recovery":["c1","c2"]}'
|
|
211
|
+
|
|
212
|
+
# 自然语言
|
|
213
|
+
metadata: "密码是 abc123,双因素认证是 JBSWY3DP,备用邮箱 backup@gmail.com"
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## 数据存储
|
|
217
|
+
|
|
218
|
+
所有数据存储在: `~/.botbrowser-mcp/botbrowser.db` (SQLite)
|
|
219
|
+
|
|
220
|
+
**数据库表:**
|
|
221
|
+
- `browser_profiles` - 浏览器配置
|
|
222
|
+
- `accounts` - 账号信息
|
|
223
|
+
- `browser_instances` - 运行中的实例
|
|
224
|
+
|
|
225
|
+
可使用 SQLite 客户端查看:
|
|
226
|
+
```bash
|
|
227
|
+
sqlite3 ~/.botbrowser-mcp/botbrowser.db
|
|
228
|
+
SELECT * FROM browser_profiles;
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## 常见问题
|
|
232
|
+
|
|
233
|
+
**Q: 如何知道哪个实例是活跃的?**
|
|
234
|
+
A: 使用 `list_browser_instances` 查看,`is_active: 1` 的实例就是当前活跃实例。
|
|
235
|
+
|
|
236
|
+
**Q: 可以同时操作多个实例吗?**
|
|
237
|
+
A: 不可以。浏览器操作工具只作用于活跃实例,需要先 `switch_browser_instance` 切换。
|
|
238
|
+
|
|
239
|
+
**Q: Cookie 什么时候保存?**
|
|
240
|
+
A: 停止实例时(`stop_browser_instance`)会自动保存到 `storage_state_path`。
|
|
241
|
+
|
|
242
|
+
**Q: 孤立实例记录是什么?**
|
|
243
|
+
A: 如果程序异常退出,浏览器已关闭但数据库记录还在,使用 `cleanup_orphaned_instances` 清理。
|
|
244
|
+
|
|
245
|
+
## 故障排查
|
|
246
|
+
|
|
247
|
+
如果遇到 "Connection closed" 错误:
|
|
248
|
+
1. 确保使用最新版本: `npm install -g botbrowser-mcp@latest`
|
|
249
|
+
2. 尝试完整路径: `"command": "/usr/local/bin/botbrowser-mcp"`
|
|
250
|
+
3. 检查 Node.js 已安装: `node --version`
|
|
251
|
+
|
|
252
|
+
## 依赖
|
|
39
253
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
254
|
+
- Node.js 18+
|
|
255
|
+
- @playwright/mcp - 浏览器自动化工具
|
|
256
|
+
- playwright - 浏览器驱动
|
|
257
|
+
- better-sqlite3 - SQLite 数据库
|
|
44
258
|
|
|
45
|
-
##
|
|
259
|
+
## 许可证
|
|
46
260
|
|
|
47
261
|
Apache-2.0
|
|
48
262
|
|
package/dist/cli.d.ts
DELETED
package/dist/cli.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* botbrowser-mcp CLI
|
|
4
|
-
*/
|
|
5
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
6
|
-
import { createConnection } from './index';
|
|
7
|
-
(async () => {
|
|
8
|
-
// 直接使用 @playwright/mcp 的 createConnection
|
|
9
|
-
const server = await createConnection();
|
|
10
|
-
const transport = new StdioServerTransport();
|
|
11
|
-
await server.connect(transport);
|
|
12
|
-
})();
|
|
13
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,CAAC,KAAK,IAAI,EAAE;IACV,0CAA0C;IAC1C,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC,CAAC,EAAE,CAAC"}
|