botbrowser-mcp 0.1.6 → 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/index.d.ts +2 -1
- package/dist/index.js +28 -9
- package/dist/index.js.map +1 -1
- package/dist/playwright/manager.js +8 -2
- package/dist/playwright/manager.js.map +1 -1
- package/dist/tools/instance.js +6 -0
- 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/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
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -10,20 +10,35 @@ import { PlaywrightManager } from './playwright/manager.js';
|
|
|
10
10
|
import { profileTools } from './tools/profile.js';
|
|
11
11
|
import { accountTools } from './tools/account.js';
|
|
12
12
|
import { instanceTools, setManager as setInstanceManager } from './tools/instance.js';
|
|
13
|
-
import {
|
|
13
|
+
import { PlaywrightMCPProxy } from './tools/playwright-mcp-proxy.js';
|
|
14
14
|
// 初始化数据库
|
|
15
15
|
initDatabase();
|
|
16
16
|
// 创建 Playwright 管理器
|
|
17
17
|
const manager = new PlaywrightManager();
|
|
18
18
|
setInstanceManager(manager);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
};
|
|
19
|
+
// 创建 Playwright MCP 代理并导出为全局变量(供 switch_browser_instance 使用)
|
|
20
|
+
export const playwrightMCPProxy = new PlaywrightMCPProxy(async () => {
|
|
21
|
+
const context = manager.getActiveContext();
|
|
22
|
+
if (!context) {
|
|
23
|
+
throw new Error('没有活跃的浏览器实例,请先使用 launch_instance 启动');
|
|
24
|
+
}
|
|
25
|
+
return context;
|
|
26
|
+
});
|
|
27
|
+
// 初始化工具
|
|
28
|
+
let allTools = {};
|
|
29
|
+
async function initializeTools() {
|
|
30
|
+
// 初始化 Playwright MCP 代理
|
|
31
|
+
await playwrightMCPProxy.initialize();
|
|
32
|
+
// 获取 Playwright MCP 的所有工具
|
|
33
|
+
const playwrightTools = playwrightMCPProxy.getToolDefinitions();
|
|
34
|
+
// 合并所有工具
|
|
35
|
+
allTools = {
|
|
36
|
+
...profileTools,
|
|
37
|
+
...accountTools,
|
|
38
|
+
...instanceTools,
|
|
39
|
+
...playwrightTools, // 完整的 Playwright MCP 工具集
|
|
40
|
+
};
|
|
41
|
+
}
|
|
27
42
|
// 创建 MCP Server
|
|
28
43
|
const server = new Server({
|
|
29
44
|
name: 'botbrowser-mcp',
|
|
@@ -65,14 +80,18 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
65
80
|
});
|
|
66
81
|
// 启动服务器
|
|
67
82
|
async function main() {
|
|
83
|
+
// 初始化所有工具
|
|
84
|
+
await initializeTools();
|
|
68
85
|
const transport = new StdioServerTransport();
|
|
69
86
|
await server.connect(transport);
|
|
70
87
|
// 优雅退出
|
|
71
88
|
process.on('SIGINT', async () => {
|
|
89
|
+
await playwrightMCPProxy.close();
|
|
72
90
|
await manager.stopAll();
|
|
73
91
|
process.exit(0);
|
|
74
92
|
});
|
|
75
93
|
process.on('SIGTERM', async () => {
|
|
94
|
+
await playwrightMCPProxy.close();
|
|
76
95
|
await manager.stopAll();
|
|
77
96
|
process.exit(0);
|
|
78
97
|
});
|
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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -78,6 +78,10 @@ export class PlaywrightManager {
|
|
|
78
78
|
executablePath: profile.executable_path,
|
|
79
79
|
...options, // launchOptions 中可以包含 headless、channel 等配置
|
|
80
80
|
});
|
|
81
|
+
// 确保至少有一个页面存在
|
|
82
|
+
if (context.pages().length === 0) {
|
|
83
|
+
await context.newPage();
|
|
84
|
+
}
|
|
81
85
|
// 保存到数据库
|
|
82
86
|
const instanceId = this.instanceRepo.create({
|
|
83
87
|
profile_alias: profileAlias,
|
|
@@ -158,11 +162,13 @@ export class PlaywrightManager {
|
|
|
158
162
|
*/
|
|
159
163
|
getActiveContext() {
|
|
160
164
|
const activeInstance = this.instanceRepo.getActive();
|
|
161
|
-
if (!activeInstance)
|
|
165
|
+
if (!activeInstance) {
|
|
162
166
|
return null;
|
|
167
|
+
}
|
|
163
168
|
const instance = this.instances.get(activeInstance.id);
|
|
164
|
-
if (!instance)
|
|
169
|
+
if (!instance) {
|
|
165
170
|
return null;
|
|
171
|
+
}
|
|
166
172
|
this.instanceRepo.updateLastActive(activeInstance.id);
|
|
167
173
|
return instance.context;
|
|
168
174
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/playwright/manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/playwright/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/instance.js
CHANGED
|
@@ -55,6 +55,12 @@ export const instanceTools = {
|
|
|
55
55
|
},
|
|
56
56
|
handler: async (args) => {
|
|
57
57
|
await manager.switchActive(args.instance_id);
|
|
58
|
+
// CRITICAL: Reset Playwright MCP's context cache
|
|
59
|
+
// This forces it to fetch the new active context on the next tool call
|
|
60
|
+
const { playwrightMCPProxy } = await import('../index.js');
|
|
61
|
+
if (playwrightMCPProxy) {
|
|
62
|
+
await playwrightMCPProxy.resetContext();
|
|
63
|
+
}
|
|
58
64
|
return {
|
|
59
65
|
content: [{
|
|
60
66
|
type: 'text',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/tools/instance.ts"],"names":[],"mappings":"AAKA,IAAI,OAA0B,CAAC;AAE/B,MAAM,UAAU,UAAU,CAAC,CAAoB;IAC7C,OAAO,GAAG,CAAC,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,cAAc,EAAE;QACd,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE;gBACzD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;gBAC1D,cAAc,EAAE;oBACd,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sHAAsH;oBACnI,oBAAoB,EAAE,IAAI;iBAC3B;aACF;YACD,QAAQ,EAAE,CAAC,eAAe,CAAC;SAC5B;QACD,OAAO,EAAE,KAAK,EAAE,IAAS,EAAE,EAAE;YAC3B,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAClG,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,SAAS,EAAE,OAAO;qBACzB,CAAC;aACH,CAAC;QACJ,CAAC;KACF;IAED,sBAAsB,EAAE;QACtB,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;qBACzC,CAAC;aACH,CAAC;QACJ,CAAC;KACF;IAED,uBAAuB,EAAE;QACvB,WAAW,EAAE,4BAA4B;QACzC,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE;aACrD;YACD,QAAQ,EAAE,CAAC,aAAa,CAAC;SAC1B;QACD,OAAO,EAAE,KAAK,EAAE,IAAS,EAAE,EAAE;YAC3B,MAAM,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/tools/instance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright MCP Dynamic Multi-Instance Proxy
|
|
3
|
+
*
|
|
4
|
+
* This proxy wraps @playwright/mcp to support dynamic browser context switching.
|
|
5
|
+
*
|
|
6
|
+
* Key Architecture Change:
|
|
7
|
+
* - Standard @playwright/mcp caches the BrowserContext at initialization
|
|
8
|
+
* - This proxy ensures every tool call uses the CURRENT active context
|
|
9
|
+
* - Enables multiple browser instances with dynamic switching via switch_browser_instance
|
|
10
|
+
*/
|
|
11
|
+
import { BrowserContext } from 'playwright';
|
|
12
|
+
export declare class PlaywrightMCPProxy {
|
|
13
|
+
private mcpServer;
|
|
14
|
+
private backend;
|
|
15
|
+
private contextGetter;
|
|
16
|
+
private factory;
|
|
17
|
+
private tools;
|
|
18
|
+
constructor(contextGetter: () => Promise<BrowserContext>);
|
|
19
|
+
/**
|
|
20
|
+
* Initialize the MCP connection with our dynamic context factory
|
|
21
|
+
*
|
|
22
|
+
* We directly use Playwright MCP's internal modules to inject our
|
|
23
|
+
* custom factory, bypassing the createConnection() helper which
|
|
24
|
+
* doesn't support dynamic context switching.
|
|
25
|
+
*/
|
|
26
|
+
initialize(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Load all tool definitions from Playwright MCP
|
|
29
|
+
*/
|
|
30
|
+
private loadTools;
|
|
31
|
+
/**
|
|
32
|
+
* Get all tool definitions for MCP protocol
|
|
33
|
+
*/
|
|
34
|
+
getToolDefinitions(): Record<string, any>;
|
|
35
|
+
/**
|
|
36
|
+
* Call a Playwright MCP tool
|
|
37
|
+
*
|
|
38
|
+
* Each call will use the CURRENT active browser context thanks to our
|
|
39
|
+
* dynamic factory, enabling proper multi-instance support.
|
|
40
|
+
*/
|
|
41
|
+
callTool(name: string, args: any): Promise<any>;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a tool exists
|
|
44
|
+
*/
|
|
45
|
+
hasTool(name: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Get list of all tool names
|
|
48
|
+
*/
|
|
49
|
+
getToolNames(): string[];
|
|
50
|
+
/**
|
|
51
|
+
* Reset the browser context cache
|
|
52
|
+
*
|
|
53
|
+
* This forces Playwright MCP's Context to clear its cached BrowserContext,
|
|
54
|
+
* so the next tool call will fetch the current active context from our factory.
|
|
55
|
+
*
|
|
56
|
+
* CRITICAL for multi-instance switching to work correctly.
|
|
57
|
+
*/
|
|
58
|
+
resetContext(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Close/cleanup the proxy
|
|
61
|
+
*/
|
|
62
|
+
close(): Promise<void>;
|
|
63
|
+
}
|
|
@@ -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/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"}
|
package/dist/tools/browser.d.ts
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 浏览器操作工具
|
|
3
|
-
* 基于 Playwright API 实现常用浏览器操作
|
|
4
|
-
*/
|
|
5
|
-
import { PlaywrightManager } from '../playwright/manager.js';
|
|
6
|
-
export declare function setManager(m: PlaywrightManager): void;
|
|
7
|
-
export declare const browserTools: {
|
|
8
|
-
browser_navigate: {
|
|
9
|
-
description: string;
|
|
10
|
-
inputSchema: {
|
|
11
|
-
type: string;
|
|
12
|
-
properties: {
|
|
13
|
-
url: {
|
|
14
|
-
type: string;
|
|
15
|
-
description: string;
|
|
16
|
-
};
|
|
17
|
-
};
|
|
18
|
-
required: string[];
|
|
19
|
-
};
|
|
20
|
-
handler: (args: any) => Promise<{
|
|
21
|
-
content: {
|
|
22
|
-
type: string;
|
|
23
|
-
text: string;
|
|
24
|
-
}[];
|
|
25
|
-
}>;
|
|
26
|
-
};
|
|
27
|
-
browser_click: {
|
|
28
|
-
description: string;
|
|
29
|
-
inputSchema: {
|
|
30
|
-
type: string;
|
|
31
|
-
properties: {
|
|
32
|
-
selector: {
|
|
33
|
-
type: string;
|
|
34
|
-
description: string;
|
|
35
|
-
};
|
|
36
|
-
};
|
|
37
|
-
required: string[];
|
|
38
|
-
};
|
|
39
|
-
handler: (args: any) => Promise<{
|
|
40
|
-
content: {
|
|
41
|
-
type: string;
|
|
42
|
-
text: string;
|
|
43
|
-
}[];
|
|
44
|
-
}>;
|
|
45
|
-
};
|
|
46
|
-
browser_fill: {
|
|
47
|
-
description: string;
|
|
48
|
-
inputSchema: {
|
|
49
|
-
type: string;
|
|
50
|
-
properties: {
|
|
51
|
-
selector: {
|
|
52
|
-
type: string;
|
|
53
|
-
description: string;
|
|
54
|
-
};
|
|
55
|
-
value: {
|
|
56
|
-
type: string;
|
|
57
|
-
description: string;
|
|
58
|
-
};
|
|
59
|
-
};
|
|
60
|
-
required: string[];
|
|
61
|
-
};
|
|
62
|
-
handler: (args: any) => Promise<{
|
|
63
|
-
content: {
|
|
64
|
-
type: string;
|
|
65
|
-
text: string;
|
|
66
|
-
}[];
|
|
67
|
-
}>;
|
|
68
|
-
};
|
|
69
|
-
browser_screenshot: {
|
|
70
|
-
description: string;
|
|
71
|
-
inputSchema: {
|
|
72
|
-
type: string;
|
|
73
|
-
properties: {
|
|
74
|
-
path: {
|
|
75
|
-
type: string;
|
|
76
|
-
description: string;
|
|
77
|
-
};
|
|
78
|
-
fullPage: {
|
|
79
|
-
type: string;
|
|
80
|
-
description: string;
|
|
81
|
-
};
|
|
82
|
-
};
|
|
83
|
-
required: string[];
|
|
84
|
-
};
|
|
85
|
-
handler: (args: any) => Promise<{
|
|
86
|
-
content: {
|
|
87
|
-
type: string;
|
|
88
|
-
text: string;
|
|
89
|
-
}[];
|
|
90
|
-
}>;
|
|
91
|
-
};
|
|
92
|
-
browser_get_text: {
|
|
93
|
-
description: string;
|
|
94
|
-
inputSchema: {
|
|
95
|
-
type: string;
|
|
96
|
-
properties: {
|
|
97
|
-
selector: {
|
|
98
|
-
type: string;
|
|
99
|
-
description: string;
|
|
100
|
-
};
|
|
101
|
-
};
|
|
102
|
-
required: string[];
|
|
103
|
-
};
|
|
104
|
-
handler: (args: any) => Promise<{
|
|
105
|
-
content: {
|
|
106
|
-
type: string;
|
|
107
|
-
text: string;
|
|
108
|
-
}[];
|
|
109
|
-
}>;
|
|
110
|
-
};
|
|
111
|
-
browser_wait: {
|
|
112
|
-
description: string;
|
|
113
|
-
inputSchema: {
|
|
114
|
-
type: string;
|
|
115
|
-
properties: {
|
|
116
|
-
selector: {
|
|
117
|
-
type: string;
|
|
118
|
-
description: string;
|
|
119
|
-
};
|
|
120
|
-
timeout: {
|
|
121
|
-
type: string;
|
|
122
|
-
description: string;
|
|
123
|
-
};
|
|
124
|
-
};
|
|
125
|
-
};
|
|
126
|
-
handler: (args: any) => Promise<{
|
|
127
|
-
content: {
|
|
128
|
-
type: string;
|
|
129
|
-
text: string;
|
|
130
|
-
}[];
|
|
131
|
-
}>;
|
|
132
|
-
};
|
|
133
|
-
browser_evaluate: {
|
|
134
|
-
description: string;
|
|
135
|
-
inputSchema: {
|
|
136
|
-
type: string;
|
|
137
|
-
properties: {
|
|
138
|
-
script: {
|
|
139
|
-
type: string;
|
|
140
|
-
description: string;
|
|
141
|
-
};
|
|
142
|
-
};
|
|
143
|
-
required: string[];
|
|
144
|
-
};
|
|
145
|
-
handler: (args: any) => Promise<{
|
|
146
|
-
content: {
|
|
147
|
-
type: string;
|
|
148
|
-
text: string;
|
|
149
|
-
}[];
|
|
150
|
-
}>;
|
|
151
|
-
};
|
|
152
|
-
browser_new_page: {
|
|
153
|
-
description: string;
|
|
154
|
-
inputSchema: {
|
|
155
|
-
type: string;
|
|
156
|
-
properties: {};
|
|
157
|
-
};
|
|
158
|
-
handler: () => Promise<{
|
|
159
|
-
content: {
|
|
160
|
-
type: string;
|
|
161
|
-
text: string;
|
|
162
|
-
}[];
|
|
163
|
-
}>;
|
|
164
|
-
};
|
|
165
|
-
browser_get_url: {
|
|
166
|
-
description: string;
|
|
167
|
-
inputSchema: {
|
|
168
|
-
type: string;
|
|
169
|
-
properties: {};
|
|
170
|
-
};
|
|
171
|
-
handler: () => Promise<{
|
|
172
|
-
content: {
|
|
173
|
-
type: string;
|
|
174
|
-
text: string;
|
|
175
|
-
}[];
|
|
176
|
-
}>;
|
|
177
|
-
};
|
|
178
|
-
};
|
package/dist/tools/browser.js
DELETED
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
let manager;
|
|
2
|
-
export function setManager(m) {
|
|
3
|
-
manager = m;
|
|
4
|
-
}
|
|
5
|
-
async function getActivePage() {
|
|
6
|
-
const context = manager.getActiveContext();
|
|
7
|
-
if (!context) {
|
|
8
|
-
throw new Error('没有活跃的浏览器实例,请先使用 launch_browser 启动');
|
|
9
|
-
}
|
|
10
|
-
const pages = context.pages();
|
|
11
|
-
if (pages.length === 0) {
|
|
12
|
-
return await context.newPage();
|
|
13
|
-
}
|
|
14
|
-
return pages[pages.length - 1];
|
|
15
|
-
}
|
|
16
|
-
export const browserTools = {
|
|
17
|
-
browser_navigate: {
|
|
18
|
-
description: '导航到指定URL',
|
|
19
|
-
inputSchema: {
|
|
20
|
-
type: 'object',
|
|
21
|
-
properties: {
|
|
22
|
-
url: { type: 'string', description: 'URL地址' },
|
|
23
|
-
},
|
|
24
|
-
required: ['url'],
|
|
25
|
-
},
|
|
26
|
-
handler: async (args) => {
|
|
27
|
-
const page = await getActivePage();
|
|
28
|
-
await page.goto(args.url);
|
|
29
|
-
return {
|
|
30
|
-
content: [{
|
|
31
|
-
type: 'text',
|
|
32
|
-
text: `已导航到 ${args.url}`,
|
|
33
|
-
}],
|
|
34
|
-
};
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
browser_click: {
|
|
38
|
-
description: '点击页面元素',
|
|
39
|
-
inputSchema: {
|
|
40
|
-
type: 'object',
|
|
41
|
-
properties: {
|
|
42
|
-
selector: { type: 'string', description: 'CSS选择器或文本选择器' },
|
|
43
|
-
},
|
|
44
|
-
required: ['selector'],
|
|
45
|
-
},
|
|
46
|
-
handler: async (args) => {
|
|
47
|
-
const page = await getActivePage();
|
|
48
|
-
await page.click(args.selector);
|
|
49
|
-
return {
|
|
50
|
-
content: [{
|
|
51
|
-
type: 'text',
|
|
52
|
-
text: `已点击元素: ${args.selector}`,
|
|
53
|
-
}],
|
|
54
|
-
};
|
|
55
|
-
},
|
|
56
|
-
},
|
|
57
|
-
browser_fill: {
|
|
58
|
-
description: '填充输入框',
|
|
59
|
-
inputSchema: {
|
|
60
|
-
type: 'object',
|
|
61
|
-
properties: {
|
|
62
|
-
selector: { type: 'string', description: 'CSS选择器' },
|
|
63
|
-
value: { type: 'string', description: '填充的值' },
|
|
64
|
-
},
|
|
65
|
-
required: ['selector', 'value'],
|
|
66
|
-
},
|
|
67
|
-
handler: async (args) => {
|
|
68
|
-
const page = await getActivePage();
|
|
69
|
-
await page.fill(args.selector, args.value);
|
|
70
|
-
return {
|
|
71
|
-
content: [{
|
|
72
|
-
type: 'text',
|
|
73
|
-
text: `已填充 ${args.selector}`,
|
|
74
|
-
}],
|
|
75
|
-
};
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
browser_screenshot: {
|
|
79
|
-
description: '截取页面截图',
|
|
80
|
-
inputSchema: {
|
|
81
|
-
type: 'object',
|
|
82
|
-
properties: {
|
|
83
|
-
path: { type: 'string', description: '保存路径' },
|
|
84
|
-
fullPage: { type: 'boolean', description: '是否截取整个页面' },
|
|
85
|
-
},
|
|
86
|
-
required: ['path'],
|
|
87
|
-
},
|
|
88
|
-
handler: async (args) => {
|
|
89
|
-
const page = await getActivePage();
|
|
90
|
-
await page.screenshot({
|
|
91
|
-
path: args.path,
|
|
92
|
-
fullPage: args.fullPage || false
|
|
93
|
-
});
|
|
94
|
-
return {
|
|
95
|
-
content: [{
|
|
96
|
-
type: 'text',
|
|
97
|
-
text: `截图已保存到 ${args.path}`,
|
|
98
|
-
}],
|
|
99
|
-
};
|
|
100
|
-
},
|
|
101
|
-
},
|
|
102
|
-
browser_get_text: {
|
|
103
|
-
description: '获取元素文本内容',
|
|
104
|
-
inputSchema: {
|
|
105
|
-
type: 'object',
|
|
106
|
-
properties: {
|
|
107
|
-
selector: { type: 'string', description: 'CSS选择器' },
|
|
108
|
-
},
|
|
109
|
-
required: ['selector'],
|
|
110
|
-
},
|
|
111
|
-
handler: async (args) => {
|
|
112
|
-
const page = await getActivePage();
|
|
113
|
-
const text = await page.textContent(args.selector);
|
|
114
|
-
return {
|
|
115
|
-
content: [{
|
|
116
|
-
type: 'text',
|
|
117
|
-
text: text || '',
|
|
118
|
-
}],
|
|
119
|
-
};
|
|
120
|
-
},
|
|
121
|
-
},
|
|
122
|
-
browser_wait: {
|
|
123
|
-
description: '等待指定时间或元素出现',
|
|
124
|
-
inputSchema: {
|
|
125
|
-
type: 'object',
|
|
126
|
-
properties: {
|
|
127
|
-
selector: { type: 'string', description: 'CSS选择器(等待元素出现)' },
|
|
128
|
-
timeout: { type: 'number', description: '超时时间(毫秒)' },
|
|
129
|
-
},
|
|
130
|
-
},
|
|
131
|
-
handler: async (args) => {
|
|
132
|
-
const page = await getActivePage();
|
|
133
|
-
if (args.selector) {
|
|
134
|
-
await page.waitForSelector(args.selector, { timeout: args.timeout || 30000 });
|
|
135
|
-
return {
|
|
136
|
-
content: [{
|
|
137
|
-
type: 'text',
|
|
138
|
-
text: `元素 ${args.selector} 已出现`,
|
|
139
|
-
}],
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
else if (args.timeout) {
|
|
143
|
-
await page.waitForTimeout(args.timeout);
|
|
144
|
-
return {
|
|
145
|
-
content: [{
|
|
146
|
-
type: 'text',
|
|
147
|
-
text: `已等待 ${args.timeout}ms`,
|
|
148
|
-
}],
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
throw new Error('必须提供 selector 或 timeout');
|
|
152
|
-
},
|
|
153
|
-
},
|
|
154
|
-
browser_evaluate: {
|
|
155
|
-
description: '在页面中执行JavaScript代码',
|
|
156
|
-
inputSchema: {
|
|
157
|
-
type: 'object',
|
|
158
|
-
properties: {
|
|
159
|
-
script: { type: 'string', description: 'JavaScript代码' },
|
|
160
|
-
},
|
|
161
|
-
required: ['script'],
|
|
162
|
-
},
|
|
163
|
-
handler: async (args) => {
|
|
164
|
-
const page = await getActivePage();
|
|
165
|
-
const result = await page.evaluate(args.script);
|
|
166
|
-
return {
|
|
167
|
-
content: [{
|
|
168
|
-
type: 'text',
|
|
169
|
-
text: JSON.stringify(result, null, 2),
|
|
170
|
-
}],
|
|
171
|
-
};
|
|
172
|
-
},
|
|
173
|
-
},
|
|
174
|
-
browser_new_page: {
|
|
175
|
-
description: '打开新标签页',
|
|
176
|
-
inputSchema: {
|
|
177
|
-
type: 'object',
|
|
178
|
-
properties: {},
|
|
179
|
-
},
|
|
180
|
-
handler: async () => {
|
|
181
|
-
const context = manager.getActiveContext();
|
|
182
|
-
if (!context) {
|
|
183
|
-
throw new Error('没有活跃的浏览器实例');
|
|
184
|
-
}
|
|
185
|
-
await context.newPage();
|
|
186
|
-
return {
|
|
187
|
-
content: [{
|
|
188
|
-
type: 'text',
|
|
189
|
-
text: '已打开新标签页',
|
|
190
|
-
}],
|
|
191
|
-
};
|
|
192
|
-
},
|
|
193
|
-
},
|
|
194
|
-
browser_get_url: {
|
|
195
|
-
description: '获取当前页面URL',
|
|
196
|
-
inputSchema: {
|
|
197
|
-
type: 'object',
|
|
198
|
-
properties: {},
|
|
199
|
-
},
|
|
200
|
-
handler: async () => {
|
|
201
|
-
const page = await getActivePage();
|
|
202
|
-
return {
|
|
203
|
-
content: [{
|
|
204
|
-
type: 'text',
|
|
205
|
-
text: page.url(),
|
|
206
|
-
}],
|
|
207
|
-
};
|
|
208
|
-
},
|
|
209
|
-
},
|
|
210
|
-
};
|
|
211
|
-
//# sourceMappingURL=browser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"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"}
|