@iflow-mcp/roxybrowserlabs-roxybrowser-mcp-server 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,216 @@
1
+ # RoxyBrowser MCP Server
2
+
3
+ [English](README.md) | [δΈ­ζ–‡](README_CN.md)
4
+
5
+ A Model Context Protocol (MCP) server for [RoxyBrowser](https://www.roxybrowser.com/) that provides AI assistants with the ability to manage browser instances and obtain Chrome DevTools Protocol (CDP) WebSocket endpoints for automation.
6
+
7
+ ## Features
8
+
9
+ - πŸš€ **Browser Management**: Open and close RoxyBrowser instances programmatically
10
+ - πŸ”— **CDP Integration**: Get WebSocket endpoints for Chrome DevTools Protocol automation
11
+ - πŸ€– **AI-Friendly**: Seamlessly integrates with AI assistants through MCP
12
+ - 🎯 **Playwright Ready**: Works with [RoxyBrowser Playwright MCP](https://github.com/roxybrowserlabs/roxybrowser-playwright-mcp) (RoxyBrowser's customized Playwright MCP)
13
+ - πŸ“Š **Workspace Support**: Manage browsers across different workspaces and projects
14
+ - πŸ› οΈ **Browser Creation**: Create browsers (single or batch) with full configuration
15
+ - 🌐 **Proxy Management**: List, create, detect, and manage proxy configurations
16
+ - πŸ‘€ **Account Management**: Manage platform accounts and credentials in workspaces
17
+ - πŸ”§ **Advanced Configuration**: Fingerprints, cache clear, random fingerprint, and more
18
+ - πŸ₯ **Health Check**: Server and workspace connectivity diagnostics
19
+
20
+ ## Quick Start
21
+
22
+ ### Prerequisites
23
+
24
+ 1. **RoxyBrowser** installed and running
25
+ 2. **RoxyBrowser API** enabled in settings:
26
+ - Open RoxyBrowser β†’ API
27
+ - Set "API Status" to "Enable"
28
+ - Copy your API Key
29
+ - Note the API port (default: 50000)
30
+
31
+ ### MCP Client Configuration
32
+
33
+ Add both RoxyBrowser OpenAPI and RoxyBrowser Playwright MCP to your MCP client configuration:
34
+
35
+ **Claude Desktop / VS Code / Cursor:**
36
+ ```json
37
+ {
38
+ "mcpServers": {
39
+ "roxybrowser-openapi": {
40
+ "command": "npx",
41
+ "args": ["@roxybrowser/openapi@latest"],
42
+ "env": {
43
+ "ROXY_API_KEY": "YOUR API KEY",
44
+ "ROXY_API_HOST": "http://127.0.0.1:50000"
45
+ }
46
+ },
47
+ "roxybrowser-playwright-mcp": {
48
+ "command": "npx",
49
+ "args": ["@roxybrowser/playwright-mcp@latest"]
50
+ }
51
+ }
52
+ }
53
+ ```
54
+
55
+ **Note:** Replace `YOUR API KEY` and `YOUR API HOST` with your actual RoxyBrowser credentials.
56
+
57
+ ## Available Tools
58
+
59
+ ### Workspace
60
+ - `roxy_list_workspaces` - List all available workspaces and their projects
61
+
62
+ ### Browser
63
+ - `roxy_list_browsers` - List browsers in a workspace/project with filtering
64
+ - `roxy_create_browser` - Create a browser with full configuration
65
+ - `roxy_batch_create_browsers` - Create multiple browsers in batch
66
+ - `roxy_open_browsers` - Open browsers and get CDP WebSocket endpoints for automation
67
+ - `roxy_update_browser` - Update existing browser configuration
68
+ - `roxy_close_browsers` - Close running browsers (does NOT free quota)
69
+ - `roxy_delete_browsers` - Delete browser profiles permanently (frees quota)
70
+ - `roxy_get_browser_detail` - Get detailed browser information and configuration
71
+ - `roxy_get_connection_info` - Get CDP endpoints and PIDs for opened browsers
72
+ - `roxy_clear_local_cache` - Clear local browser cache
73
+ - `roxy_clear_server_cache` - Clear server-side browser cache
74
+ - `roxy_random_fingerprint` - Randomize browser fingerprint
75
+ - `roxy_list_labels` - Get browser labels/tags for organization
76
+
77
+ ### Proxy
78
+ - `roxy_list_proxies` - List proxy configurations in a workspace
79
+ - `roxy_store_proxies` - Get list of proxies you've purchased (store)
80
+ - `roxy_create_proxy` - Create a proxy configuration
81
+ - `roxy_batch_create_proxies` - Create multiple proxies in batch
82
+ - `roxy_detect_proxy` - Detect/test proxy availability
83
+ - `roxy_modify_proxy` - Modify existing proxy configuration
84
+ - `roxy_delete_proxies` - Delete proxy configurations
85
+
86
+ ### Account
87
+ - `roxy_list_accounts` - List platform accounts and credentials in a workspace
88
+ - `roxy_create_account` - Create a platform account
89
+ - `roxy_batch_create_accounts` - Create multiple accounts in batch
90
+ - `roxy_modify_account` - Modify existing account
91
+ - `roxy_delete_accounts` - Delete accounts
92
+
93
+ ### Utilities
94
+ - `roxy_health_check` - Server health check and workspace/browser connectivity diagnostics
95
+
96
+ ## Complete Workflow Examples
97
+
98
+ ### Example 1: Quick Browser Automation Setup
99
+
100
+ ```
101
+ 1. AI: "Create a browser in workspace 1 with name 'Test Browser'"
102
+ β†’ Uses roxy_create_browser
103
+ β†’ Returns browser ID ready for use
104
+
105
+ 2. AI: "Open the browser I just created"
106
+ β†’ Uses roxy_open_browsers with the returned ID
107
+ β†’ Returns CDP WebSocket URL like: ws://127.0.0.1:52314/devtools/browser/xxx
108
+
109
+ 3. AI: "Navigate to gmail.com, login, and send emails"
110
+ β†’ Uses RoxyBrowser Playwright MCP tools (browser_navigate, browser_type, browser_click, etc.)
111
+ β†’ RoxyBrowser Playwright MCP connects to the opened browser via CDP endpoint
112
+
113
+ 4. AI: "Close the browser when done"
114
+ β†’ Uses roxy_close_browsers
115
+ ```
116
+
117
+ ### Example 2: Browser with Proxy
118
+
119
+ ```
120
+ 1. AI: "Detect my proxy before creating browsers"
121
+ β†’ Uses roxy_detect_proxy
122
+ β†’ Confirms proxy is available
123
+
124
+ 2. AI: "Create a browser with SOCKS5 proxy and 1920x1080 in workspace 2"
125
+ β†’ Uses roxy_create_browser with proxy configuration
126
+ β†’ Returns configured browser ID
127
+
128
+ 3. AI: "Open the browser and start automation"
129
+ β†’ Uses roxy_open_browsers β†’ gets CDP endpoint
130
+ β†’ RoxyBrowser Playwright MCP connects and begins automation
131
+ ```
132
+
133
+ ## Integration with Playwright MCP
134
+
135
+ RoxyBrowser MCP is designed to work seamlessly with [RoxyBrowser Playwright MCP](https://github.com/roxybrowserlabs/roxybrowser-playwright-mcp), our customized Playwright MCP server built specifically for RoxyBrowser compatibility.
136
+
137
+ **RoxyBrowser Playwright MCP** is based on [Microsoft's Playwright MCP](https://github.com/microsoft/playwright-mcp) with enhancements for RoxyBrowser's fingerprint browser features.
138
+
139
+ ### Workflow
140
+
141
+ 1. Use RoxyBrowser OpenAPI MCP to create and open browsers
142
+ 2. Get CDP WebSocket endpoints from opened browsers
143
+ 3. Use RoxyBrowser Playwright MCP to automate browser tasks with full Playwright capabilities
144
+
145
+ Both servers work together seamlessly when configured in your MCP client (see configuration above).
146
+
147
+ ## Development
148
+
149
+ ```bash
150
+ # Development mode with auto-rebuild
151
+ npm run dev
152
+
153
+ # Build for production
154
+ npm run build
155
+ ```
156
+
157
+ ## API Reference
158
+
159
+ ### Environment Variables
160
+
161
+ | Variable | Required | Default | Description |
162
+ |----------|----------|---------|-------------|
163
+ | `ROXY_API_KEY` | βœ… Yes | - | API key from RoxyBrowser settings |
164
+ | `ROXY_API_HOST` | βœ… Yes | `http://127.0.0.1:50000` | RoxyBrowser API endpoint |
165
+ | `ROXY_TIMEOUT` | No | `30000` | Request timeout in milliseconds |
166
+
167
+ ## Troubleshooting
168
+
169
+ ### Connection Issues
170
+
171
+ **Error: "Failed to connect to RoxyBrowser API"**
172
+
173
+ Check:
174
+ 1. RoxyBrowser is running
175
+ 2. API is enabled: RoxyBrowser β†’ API β†’ API Status = Enable
176
+ 3. Correct API key: Copy from RoxyBrowser β†’ API β†’ API Key
177
+ 4. Correct port: Check RoxyBrowser β†’ API β†’ Port Settings (default: 50000)
178
+ 5. No firewall blocking http://127.0.0.1:50000
179
+
180
+ ### Authentication Issues
181
+
182
+ **Error: "Configuration Error: API key is required"**
183
+
184
+ Set the environment variable:
185
+ ```bash
186
+ export ROXY_API_KEY="your_actual_api_key_from_roxybrowser"
187
+ ```
188
+
189
+ ### Browser Opening Issues
190
+
191
+ **Error: "Insufficient profiles quota" (Code 101 or 409)**
192
+
193
+ Solutions:
194
+ - Purchase more profiles in RoxyBrowser Billing Center
195
+ - **Delete** unused browser profiles using `roxy_delete_browsers` (closing alone does NOT free quota)
196
+ - Upgrade your subscription plan
197
+ - Check current quota usage in workspace settings
198
+
199
+ **Some browsers fail to open:**
200
+
201
+ - Check that the browser profiles exist and are not corrupted
202
+ - Ensure sufficient system resources (RAM, CPU)
203
+ - Verify the dirIds are valid (use `roxy_list_browsers` first)
204
+ - Run `roxy_health_check` for connectivity and health diagnostics
205
+
206
+ ## License
207
+
208
+ MIT License - see LICENSE file for details.
209
+
210
+ ## Contributing
211
+
212
+ 1. Fork the repository
213
+ 2. Create a feature branch
214
+ 3. Make your changes
215
+ 4. Add tests if applicable
216
+ 5. Submit a pull request
package/lib/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * RoxyBrowser MCP Server
4
+ *
5
+ * Model Context Protocol server for RoxyBrowser automation
6
+ * Provides tools to manage browser instances and get CDP endpoints
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/lib/index.js ADDED
@@ -0,0 +1,180 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * RoxyBrowser MCP Server
4
+ *
5
+ * Model Context Protocol server for RoxyBrowser automation
6
+ * Provides tools to manage browser instances and get CDP endpoints
7
+ */
8
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
9
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
11
+ import { batchCreateAccounts, createAccount, deleteAccounts, listAccounts, modifyAccount } from './modules/account.js';
12
+ import { batchCreateBrowsers, clearLocalCache, clearServerCache, closeBrowsers, createBrowser, deleteBrowsers, getBrowserDetail, getConnectionInfo, listBrowsers, listLabels, openBrowser, randomFingerprint, updateBrowser } from './modules/browser.js';
13
+ import { healthCheck, listWorkspaces } from './modules/other.js';
14
+ import { batchCreateProxies, createProxy, deleteProxies, detectProxy, modifyProxy, proxyList, proxyStore } from './modules/proxy.js';
15
+ import { ConfigError } from './types.js';
16
+ // ========== Tool Definitions ==========
17
+ const TOOLS = [
18
+ listBrowsers.schema,
19
+ batchCreateBrowsers.schema,
20
+ createBrowser.schema,
21
+ openBrowser.schema,
22
+ updateBrowser.schema,
23
+ closeBrowsers.schema,
24
+ deleteBrowsers.schema,
25
+ getBrowserDetail.schema,
26
+ clearLocalCache.schema,
27
+ clearServerCache.schema,
28
+ randomFingerprint.schema,
29
+ listLabels.schema,
30
+ getConnectionInfo.schema,
31
+ proxyList.schema,
32
+ proxyStore.schema,
33
+ createProxy.schema,
34
+ batchCreateProxies.schema,
35
+ detectProxy.schema,
36
+ modifyProxy.schema,
37
+ deleteProxies.schema,
38
+ // getDetectChannels.schema,
39
+ listAccounts.schema,
40
+ createAccount.schema,
41
+ batchCreateAccounts.schema,
42
+ modifyAccount.schema,
43
+ deleteAccounts.schema,
44
+ listWorkspaces.schema,
45
+ healthCheck.schema,
46
+ ];
47
+ // ========== MCP Server ==========
48
+ class RoxyBrowserMCPServer {
49
+ server;
50
+ constructor() {
51
+ this.server = new Server({
52
+ name: 'roxybrowser-openapi-mcp',
53
+ version: '1.0.0',
54
+ }, {
55
+ capabilities: {
56
+ tools: {},
57
+ },
58
+ });
59
+ this.setupHandlers();
60
+ // Initialize RoxyBrowser client
61
+ // const config = getConfig()
62
+ // this.roxyClient = new RoxyClient(config)
63
+ }
64
+ setupHandlers() {
65
+ // List available tools
66
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
67
+ tools: TOOLS,
68
+ }));
69
+ // Handle tool calls
70
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
71
+ const { name, arguments: args } = request.params;
72
+ try {
73
+ switch (name) {
74
+ // ζ΅θ§ˆε™¨η›Έε…³
75
+ case listBrowsers.name:
76
+ return await listBrowsers.handle(args);
77
+ case createBrowser.name:
78
+ return await createBrowser.handle(args);
79
+ case openBrowser.name:
80
+ return await openBrowser.handle(args);
81
+ case updateBrowser.name:
82
+ return await updateBrowser.handle(args);
83
+ case closeBrowsers.name:
84
+ return await closeBrowsers.handle(args);
85
+ case deleteBrowsers.name:
86
+ return await deleteBrowsers.handle(args);
87
+ case batchCreateBrowsers.name:
88
+ return await batchCreateBrowsers.handle(args);
89
+ case listLabels.name:
90
+ return await listLabels.handle(args);
91
+ case getConnectionInfo.name:
92
+ return await getConnectionInfo.handle(args);
93
+ case randomFingerprint.name:
94
+ return await randomFingerprint.handle(args);
95
+ case clearLocalCache.name:
96
+ return await clearLocalCache.handle(args);
97
+ case clearServerCache.name:
98
+ return await clearServerCache.handle(args);
99
+ case getBrowserDetail.name:
100
+ return await getBrowserDetail.handle(args);
101
+ // 账号相关
102
+ case listAccounts.name:
103
+ return await listAccounts.handle(args);
104
+ case createAccount.name:
105
+ return await createAccount.handle(args);
106
+ case batchCreateAccounts.name:
107
+ return await batchCreateAccounts.handle(args);
108
+ case modifyAccount.name:
109
+ return await modifyAccount.handle(args);
110
+ case deleteAccounts.name:
111
+ return await deleteAccounts.handle(args);
112
+ // 代理相关
113
+ case proxyList.name:
114
+ return await proxyList.handle(args);
115
+ case proxyStore.name:
116
+ return await proxyStore.handle(args);
117
+ case createProxy.name:
118
+ return await createProxy.handle(args);
119
+ case batchCreateProxies.name:
120
+ return await batchCreateProxies.handle(args);
121
+ case detectProxy.name:
122
+ return await detectProxy.handle(args);
123
+ case modifyProxy.name:
124
+ return await modifyProxy.handle(args);
125
+ case deleteProxies.name:
126
+ return await deleteProxies.handle(args);
127
+ // η©Ίι—΄εˆ—θ‘¨
128
+ case listWorkspaces.name:
129
+ return await listWorkspaces.handle(args);
130
+ // ε₯εΊ·ζ£€ζŸ₯
131
+ case healthCheck.name:
132
+ return await healthCheck.handle(args);
133
+ default:
134
+ throw new Error(`Unknown tool: ${name}`);
135
+ }
136
+ }
137
+ catch (error) {
138
+ return {
139
+ content: [
140
+ {
141
+ type: 'text',
142
+ text: error instanceof Error ? error.message : 'Unknown error',
143
+ },
144
+ ],
145
+ };
146
+ }
147
+ });
148
+ }
149
+ async run() {
150
+ console.error('πŸš€ Starting RoxyBrowser MCP Server...');
151
+ const transport = new StdioServerTransport();
152
+ await this.server.connect(transport);
153
+ console.error('βœ… RoxyBrowser MCP Server is running');
154
+ }
155
+ }
156
+ // ========== Main ==========
157
+ async function main() {
158
+ try {
159
+ const server = new RoxyBrowserMCPServer();
160
+ await server.run();
161
+ }
162
+ catch (error) {
163
+ if (error instanceof ConfigError) {
164
+ console.error(`❌ Configuration Error: ${error.message}`);
165
+ process.exit(1);
166
+ }
167
+ console.error('❌ Unexpected error:', error);
168
+ process.exit(1);
169
+ }
170
+ }
171
+ // Handle graceful shutdown
172
+ process.on('SIGINT', () => {
173
+ console.error('\nπŸ‘‹ Shutting down RoxyBrowser MCP Server...');
174
+ process.exit(0);
175
+ });
176
+ main().catch((error) => {
177
+ console.error('Fatal error:', error);
178
+ process.exit(1);
179
+ });
180
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}