ferrum-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.env.example +90 -0
- data/CHANGELOG.md +229 -0
- data/CONTRIBUTING.md +469 -0
- data/LICENSE +21 -0
- data/README.md +334 -0
- data/SECURITY.md +286 -0
- data/bin/ferrum-mcp +66 -0
- data/bin/lint +10 -0
- data/bin/serve +3 -0
- data/bin/test +4 -0
- data/docs/API_REFERENCE.md +1410 -0
- data/docs/CONFIGURATION.md +254 -0
- data/docs/DEPLOYMENT.md +846 -0
- data/docs/DOCKER.md +836 -0
- data/docs/DOCKER_BOTBROWSER.md +455 -0
- data/docs/GETTING_STARTED.md +249 -0
- data/docs/TROUBLESHOOTING.md +677 -0
- data/lib/ferrum_mcp/browser_manager.rb +101 -0
- data/lib/ferrum_mcp/cli/command_handler.rb +99 -0
- data/lib/ferrum_mcp/cli/server_runner.rb +166 -0
- data/lib/ferrum_mcp/configuration.rb +229 -0
- data/lib/ferrum_mcp/resource_manager.rb +223 -0
- data/lib/ferrum_mcp/server.rb +254 -0
- data/lib/ferrum_mcp/session.rb +227 -0
- data/lib/ferrum_mcp/session_manager.rb +183 -0
- data/lib/ferrum_mcp/tools/accept_cookies_tool.rb +458 -0
- data/lib/ferrum_mcp/tools/base_tool.rb +114 -0
- data/lib/ferrum_mcp/tools/clear_cookies_tool.rb +66 -0
- data/lib/ferrum_mcp/tools/click_tool.rb +218 -0
- data/lib/ferrum_mcp/tools/close_session_tool.rb +49 -0
- data/lib/ferrum_mcp/tools/create_session_tool.rb +146 -0
- data/lib/ferrum_mcp/tools/drag_and_drop_tool.rb +171 -0
- data/lib/ferrum_mcp/tools/evaluate_js_tool.rb +46 -0
- data/lib/ferrum_mcp/tools/execute_script_tool.rb +48 -0
- data/lib/ferrum_mcp/tools/fill_form_tool.rb +78 -0
- data/lib/ferrum_mcp/tools/find_by_text_tool.rb +153 -0
- data/lib/ferrum_mcp/tools/get_attribute_tool.rb +56 -0
- data/lib/ferrum_mcp/tools/get_cookies_tool.rb +70 -0
- data/lib/ferrum_mcp/tools/get_html_tool.rb +52 -0
- data/lib/ferrum_mcp/tools/get_session_info_tool.rb +40 -0
- data/lib/ferrum_mcp/tools/get_text_tool.rb +67 -0
- data/lib/ferrum_mcp/tools/get_title_tool.rb +42 -0
- data/lib/ferrum_mcp/tools/get_url_tool.rb +39 -0
- data/lib/ferrum_mcp/tools/go_back_tool.rb +49 -0
- data/lib/ferrum_mcp/tools/go_forward_tool.rb +49 -0
- data/lib/ferrum_mcp/tools/hover_tool.rb +76 -0
- data/lib/ferrum_mcp/tools/list_sessions_tool.rb +33 -0
- data/lib/ferrum_mcp/tools/navigate_tool.rb +59 -0
- data/lib/ferrum_mcp/tools/press_key_tool.rb +91 -0
- data/lib/ferrum_mcp/tools/query_shadow_dom_tool.rb +225 -0
- data/lib/ferrum_mcp/tools/refresh_tool.rb +49 -0
- data/lib/ferrum_mcp/tools/screenshot_tool.rb +121 -0
- data/lib/ferrum_mcp/tools/session_tool.rb +37 -0
- data/lib/ferrum_mcp/tools/set_cookie_tool.rb +77 -0
- data/lib/ferrum_mcp/tools/solve_captcha_tool.rb +528 -0
- data/lib/ferrum_mcp/transport/http_server.rb +93 -0
- data/lib/ferrum_mcp/transport/rate_limiter.rb +79 -0
- data/lib/ferrum_mcp/transport/stdio_server.rb +63 -0
- data/lib/ferrum_mcp/version.rb +5 -0
- data/lib/ferrum_mcp/whisper_service.rb +222 -0
- data/lib/ferrum_mcp.rb +35 -0
- metadata +248 -0
|
@@ -0,0 +1,677 @@
|
|
|
1
|
+
# Troubleshooting Guide
|
|
2
|
+
|
|
3
|
+
This guide helps you diagnose and fix common issues with FerrumMCP.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Server Won't Start](#server-wont-start)
|
|
8
|
+
- [Browser Issues](#browser-issues)
|
|
9
|
+
- [Session Management](#session-management)
|
|
10
|
+
- [Tool Errors](#tool-errors)
|
|
11
|
+
- [Claude Desktop Integration](#claude-desktop-integration)
|
|
12
|
+
- [Docker Issues](#docker-issues)
|
|
13
|
+
- [BotBrowser Integration](#botbrowser-integration)
|
|
14
|
+
- [Performance Issues](#performance-issues)
|
|
15
|
+
- [Logging and Debugging](#logging-and-debugging)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Server Won't Start
|
|
20
|
+
|
|
21
|
+
### Error: `cannot load such file -- ferrum`
|
|
22
|
+
|
|
23
|
+
**Cause**: Dependencies not installed
|
|
24
|
+
|
|
25
|
+
**Solution**:
|
|
26
|
+
```bash
|
|
27
|
+
bundle install
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Error: `Address already in use - bind(2) for "0.0.0.0" port 3000`
|
|
31
|
+
|
|
32
|
+
**Cause**: Port 3000 is already in use
|
|
33
|
+
|
|
34
|
+
**Solution**:
|
|
35
|
+
```bash
|
|
36
|
+
# Find process using port 3000
|
|
37
|
+
lsof -i :3000
|
|
38
|
+
|
|
39
|
+
# Kill the process
|
|
40
|
+
kill -9 <PID>
|
|
41
|
+
|
|
42
|
+
# Or use a different port
|
|
43
|
+
MCP_SERVER_PORT=3001 ruby bin/ferrum-mcp
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Error: `Zeitwerk::NameError: expected file ... to define constant ...`
|
|
47
|
+
|
|
48
|
+
**Cause**: File naming doesn't match class name
|
|
49
|
+
|
|
50
|
+
**Solution**:
|
|
51
|
+
```bash
|
|
52
|
+
# Check Zeitwerk eager loading
|
|
53
|
+
bundle exec rake zeitwerk:check
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Fix any naming mismatches reported.
|
|
57
|
+
|
|
58
|
+
### Error: `Browser path not found: /path/to/chrome`
|
|
59
|
+
|
|
60
|
+
**Cause**: Chrome/Chromium not installed or wrong path
|
|
61
|
+
|
|
62
|
+
**Solution**:
|
|
63
|
+
|
|
64
|
+
**macOS**:
|
|
65
|
+
```bash
|
|
66
|
+
# Chrome
|
|
67
|
+
BROWSER_CHROME=chrome:/Applications/Google Chrome.app/Contents/MacOS/Google Chrome:Chrome:Default
|
|
68
|
+
|
|
69
|
+
# Or use system default
|
|
70
|
+
BROWSER_CHROME=chrome::Chrome:Default
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Linux**:
|
|
74
|
+
```bash
|
|
75
|
+
# Find Chrome
|
|
76
|
+
which google-chrome
|
|
77
|
+
which chromium-browser
|
|
78
|
+
|
|
79
|
+
# Set path
|
|
80
|
+
BROWSER_CHROME=chrome:/usr/bin/google-chrome:Chrome:Default
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Browser Issues
|
|
86
|
+
|
|
87
|
+
### Error: `Ferrum::DeadBrowserError: Browser is dead`
|
|
88
|
+
|
|
89
|
+
**Cause**: Browser crashed or was killed
|
|
90
|
+
|
|
91
|
+
**Solution**:
|
|
92
|
+
1. Close the affected session: `close_session(session_id: "...")`
|
|
93
|
+
2. Create a new session
|
|
94
|
+
3. Check logs for crash reason: `logs/ferrum_mcp.log`
|
|
95
|
+
|
|
96
|
+
**Common causes**:
|
|
97
|
+
- Out of memory
|
|
98
|
+
- Browser timeout exceeded
|
|
99
|
+
- Incompatible Chrome version
|
|
100
|
+
|
|
101
|
+
### Error: `Ferrum::TimeoutError: Timed out waiting for response`
|
|
102
|
+
|
|
103
|
+
**Cause**: Browser operation took too long
|
|
104
|
+
|
|
105
|
+
**Solution**:
|
|
106
|
+
```bash
|
|
107
|
+
# Increase timeout
|
|
108
|
+
BROWSER_TIMEOUT=120 ruby bin/ferrum-mcp
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Or when creating session:
|
|
112
|
+
```ruby
|
|
113
|
+
create_session(timeout: 120)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Error: `Chrome failed to start: exited abnormally`
|
|
117
|
+
|
|
118
|
+
**Cause**: Chrome can't run (usually in Docker/CI)
|
|
119
|
+
|
|
120
|
+
**Solution**:
|
|
121
|
+
|
|
122
|
+
**Docker**:
|
|
123
|
+
```bash
|
|
124
|
+
# Run with required security options
|
|
125
|
+
docker run --shm-size=2g \
|
|
126
|
+
--security-opt seccomp=unconfined \
|
|
127
|
+
-p 3000:3000 \
|
|
128
|
+
eth3rnit3/ferrum-mcp
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Headless mode**:
|
|
132
|
+
```bash
|
|
133
|
+
BROWSER_HEADLESS=true ruby bin/ferrum-mcp
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Browser window appears but doesn't load pages
|
|
137
|
+
|
|
138
|
+
**Cause**: Network connectivity or DNS issues
|
|
139
|
+
|
|
140
|
+
**Solution**:
|
|
141
|
+
```ruby
|
|
142
|
+
# Test with simple page
|
|
143
|
+
navigate(url: "https://example.com", session_id: "...")
|
|
144
|
+
|
|
145
|
+
# Check logs
|
|
146
|
+
tail -f logs/ferrum_mcp.log
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Check**:
|
|
150
|
+
- Internet connectivity
|
|
151
|
+
- Proxy settings
|
|
152
|
+
- Firewall rules
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Session Management
|
|
157
|
+
|
|
158
|
+
### Error: `SessionError: Session not found`
|
|
159
|
+
|
|
160
|
+
**Cause**: Session doesn't exist or was closed
|
|
161
|
+
|
|
162
|
+
**Solution**:
|
|
163
|
+
```ruby
|
|
164
|
+
# List active sessions
|
|
165
|
+
list_sessions()
|
|
166
|
+
|
|
167
|
+
# Create new session
|
|
168
|
+
session_id = create_session()
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Sessions not auto-closing
|
|
172
|
+
|
|
173
|
+
**Cause**: Sessions are being actively used (no idle time)
|
|
174
|
+
|
|
175
|
+
**Behavior**: Sessions only close after 30 minutes of **inactivity**
|
|
176
|
+
|
|
177
|
+
**Solution**: Close sessions manually when done:
|
|
178
|
+
```ruby
|
|
179
|
+
close_session(session_id: "...")
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Too many sessions consuming resources
|
|
183
|
+
|
|
184
|
+
**Current behavior**: No hard limit on concurrent sessions
|
|
185
|
+
|
|
186
|
+
**Solution**:
|
|
187
|
+
```ruby
|
|
188
|
+
# List all sessions
|
|
189
|
+
sessions = list_sessions()
|
|
190
|
+
|
|
191
|
+
# Close inactive sessions
|
|
192
|
+
sessions.each do |session|
|
|
193
|
+
close_session(session_id: session['session_id'])
|
|
194
|
+
end
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Note**: Session limits (`MAX_CONCURRENT_SESSIONS`) planned for v1.1
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Tool Errors
|
|
202
|
+
|
|
203
|
+
### Error: `ToolError: Element not found`
|
|
204
|
+
|
|
205
|
+
**Cause**: Element doesn't exist or CSS/XPath selector is wrong
|
|
206
|
+
|
|
207
|
+
**Solution**:
|
|
208
|
+
```ruby
|
|
209
|
+
# Debug: Get page HTML
|
|
210
|
+
html = get_html(session_id: "...")
|
|
211
|
+
|
|
212
|
+
# Try different selectors
|
|
213
|
+
# CSS: .class-name, #id, button[type="submit"]
|
|
214
|
+
# XPath: //button[@type="submit"]
|
|
215
|
+
|
|
216
|
+
# Wait for element to appear (if page is loading)
|
|
217
|
+
# Note: wait_for_element is currently disabled
|
|
218
|
+
# Use navigate with wait for idle instead
|
|
219
|
+
navigate(url: "...", wait_until: "networkidle", session_id: "...")
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Error: `ToolError: Stale element reference`
|
|
223
|
+
|
|
224
|
+
**Cause**: Element changed after being found (page modified)
|
|
225
|
+
|
|
226
|
+
**Solution**: Tools automatically retry 3 times. If still failing:
|
|
227
|
+
```ruby
|
|
228
|
+
# Refresh page and try again
|
|
229
|
+
refresh(session_id: "...")
|
|
230
|
+
click(selector: "...", session_id: "...")
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Screenshot returns blank/black image
|
|
234
|
+
|
|
235
|
+
**Cause**: Page not fully loaded or rendering issue
|
|
236
|
+
|
|
237
|
+
**Solution**:
|
|
238
|
+
```ruby
|
|
239
|
+
# Wait for page to load - navigation already waits for load event
|
|
240
|
+
navigate(url: "...", session_id: "...")
|
|
241
|
+
# Take screenshot
|
|
242
|
+
screenshot(session_id: "...")
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Fill form doesn't work
|
|
246
|
+
|
|
247
|
+
**Cause**: Form field not found or not interactable
|
|
248
|
+
|
|
249
|
+
**Solution**:
|
|
250
|
+
```ruby
|
|
251
|
+
# 1. Verify field exists
|
|
252
|
+
get_html(session_id: "...")
|
|
253
|
+
|
|
254
|
+
# 2. Click field first to focus
|
|
255
|
+
click(selector: "input[name='username']", session_id: "...")
|
|
256
|
+
|
|
257
|
+
# 3. Fill form
|
|
258
|
+
fill_form(
|
|
259
|
+
fields: { "input[name='username']": "myusername" },
|
|
260
|
+
session_id: "..."
|
|
261
|
+
)
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### JavaScript execution fails
|
|
265
|
+
|
|
266
|
+
**Cause**: Syntax error or browser context issue
|
|
267
|
+
|
|
268
|
+
**Solution**:
|
|
269
|
+
```ruby
|
|
270
|
+
# For return value, use evaluate_js
|
|
271
|
+
result = evaluate_js(
|
|
272
|
+
script: "document.title",
|
|
273
|
+
session_id: "..."
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
# For side effects, use execute_script
|
|
277
|
+
execute_script(
|
|
278
|
+
script: "document.querySelector('#btn').click()",
|
|
279
|
+
session_id: "..."
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
# Debug errors
|
|
283
|
+
execute_script(
|
|
284
|
+
script: "console.log('Debug output')",
|
|
285
|
+
session_id: "..."
|
|
286
|
+
)
|
|
287
|
+
# Check browser console logs
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Claude Desktop Integration
|
|
293
|
+
|
|
294
|
+
### Claude Desktop doesn't show FerrumMCP
|
|
295
|
+
|
|
296
|
+
**Cause**: Configuration error or server not starting
|
|
297
|
+
|
|
298
|
+
**Solution**:
|
|
299
|
+
|
|
300
|
+
1. **Check config file location**:
|
|
301
|
+
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
302
|
+
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
303
|
+
- Linux: `~/.config/Claude/claude_desktop_config.json`
|
|
304
|
+
|
|
305
|
+
2. **Verify JSON syntax**:
|
|
306
|
+
```bash
|
|
307
|
+
# macOS
|
|
308
|
+
cat ~/Library/Application\ Support/Claude/claude_desktop_config.json | jq .
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
3. **Check paths are absolute**:
|
|
312
|
+
```json
|
|
313
|
+
{
|
|
314
|
+
"mcpServers": {
|
|
315
|
+
"ferrum-mcp": {
|
|
316
|
+
"command": "/Users/username/.rbenv/versions/3.3.5/bin/ruby",
|
|
317
|
+
"args": [
|
|
318
|
+
"/Users/username/code/ferrum-mcp/bin/ferrum-mcp",
|
|
319
|
+
"--transport",
|
|
320
|
+
"stdio"
|
|
321
|
+
]
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
4. **Restart Claude Desktop** completely (quit and reopen)
|
|
328
|
+
|
|
329
|
+
5. **Check logs**:
|
|
330
|
+
```bash
|
|
331
|
+
tail -f ~/code/ferrum-mcp/logs/ferrum_mcp.log
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Error: `command not found: ruby`
|
|
335
|
+
|
|
336
|
+
**Cause**: Ruby path is wrong or not absolute
|
|
337
|
+
|
|
338
|
+
**Solution**:
|
|
339
|
+
```bash
|
|
340
|
+
# Find Ruby path
|
|
341
|
+
which ruby
|
|
342
|
+
# Example: /Users/username/.rbenv/versions/3.3.5/bin/ruby
|
|
343
|
+
|
|
344
|
+
# Use absolute path in config
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Claude says "Tool not available"
|
|
348
|
+
|
|
349
|
+
**Cause**: Server not running or communication issue
|
|
350
|
+
|
|
351
|
+
**Solution**:
|
|
352
|
+
1. Test server manually:
|
|
353
|
+
```bash
|
|
354
|
+
ruby bin/ferrum-mcp --transport stdio
|
|
355
|
+
# Type: {"method": "list_tools"}
|
|
356
|
+
# Press Enter
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
2. Check for error output
|
|
360
|
+
3. Verify Ruby version: `ruby --version` (need 3.2+)
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Docker Issues
|
|
365
|
+
|
|
366
|
+
### Error: `docker: no matching manifest for linux/arm64`
|
|
367
|
+
|
|
368
|
+
**Cause**: Image not built for ARM architecture (M1/M2 Macs)
|
|
369
|
+
|
|
370
|
+
**Current status**: Multi-platform builds enabled (amd64, arm64)
|
|
371
|
+
|
|
372
|
+
**Solution**:
|
|
373
|
+
```bash
|
|
374
|
+
# Pull latest image
|
|
375
|
+
docker pull eth3rnit3/ferrum-mcp:latest
|
|
376
|
+
|
|
377
|
+
# Or build locally
|
|
378
|
+
docker build --platform linux/arm64 -t ferrum-mcp .
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Container starts but server not accessible
|
|
382
|
+
|
|
383
|
+
**Cause**: Port mapping or firewall issue
|
|
384
|
+
|
|
385
|
+
**Solution**:
|
|
386
|
+
```bash
|
|
387
|
+
# Check container is running
|
|
388
|
+
docker ps
|
|
389
|
+
|
|
390
|
+
# Check port mapping
|
|
391
|
+
docker port <container_id>
|
|
392
|
+
|
|
393
|
+
# Correct mapping
|
|
394
|
+
docker run -p 3000:3000 eth3rnit3/ferrum-mcp
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### Chrome crashes in Docker
|
|
398
|
+
|
|
399
|
+
**Cause**: Insufficient shared memory
|
|
400
|
+
|
|
401
|
+
**Solution**:
|
|
402
|
+
```bash
|
|
403
|
+
docker run --shm-size=2g \
|
|
404
|
+
-p 3000:3000 \
|
|
405
|
+
eth3rnit3/ferrum-mcp
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Permission denied errors in Docker
|
|
409
|
+
|
|
410
|
+
**Cause**: Container running as root
|
|
411
|
+
|
|
412
|
+
**Solution** (workaround until v1.1):
|
|
413
|
+
```bash
|
|
414
|
+
docker run --user 1000:1000 \
|
|
415
|
+
-p 3000:3000 \
|
|
416
|
+
eth3rnit3/ferrum-mcp
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## BotBrowser Integration
|
|
422
|
+
|
|
423
|
+
See [BOTBROWSER_INTEGRATION.md](BOTBROWSER_INTEGRATION.md) for detailed troubleshooting.
|
|
424
|
+
|
|
425
|
+
### Error: `BotBrowser path not found`
|
|
426
|
+
|
|
427
|
+
**Solution**:
|
|
428
|
+
```bash
|
|
429
|
+
# Verify BotBrowser installed
|
|
430
|
+
ls /opt/botbrowser/chrome
|
|
431
|
+
|
|
432
|
+
# Set path
|
|
433
|
+
BROWSER_BOTBROWSER=botbrowser:/opt/botbrowser/chrome:BotBrowser:Anti-detection
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
### Error: Popup "You are currently using a demo profile" or "Session with given id not found" after navigation
|
|
437
|
+
|
|
438
|
+
**Symptoms**:
|
|
439
|
+
- BotBrowser shows a popup about demo/invalid profile on startup
|
|
440
|
+
- "Session with given id not found" error after navigation
|
|
441
|
+
- CDP session loss between tool calls
|
|
442
|
+
- Tools work individually but fail when chained
|
|
443
|
+
|
|
444
|
+
**Cause**: Invalid, expired, or demo BotBrowser profile
|
|
445
|
+
|
|
446
|
+
**How BotBrowser profiles work**:
|
|
447
|
+
- BotBrowser uses encrypted `.enc` profile files for anti-detection fingerprints
|
|
448
|
+
- Each profile contains browser fingerprint data (user agent, canvas, WebGL, etc.)
|
|
449
|
+
- **Demo profiles**: Limited functionality, unstable CDP, cause session loss
|
|
450
|
+
- **Trial/Premium profiles**: Full functionality, stable CDP session
|
|
451
|
+
|
|
452
|
+
Demo or invalid profiles cause unstable Chrome DevTools Protocol (CDP) behavior, making it impossible to execute multiple operations in sequence.
|
|
453
|
+
|
|
454
|
+
**Solution**: Use valid trial or premium BotBrowser profiles
|
|
455
|
+
|
|
456
|
+
**Configuration**:
|
|
457
|
+
|
|
458
|
+
```bash
|
|
459
|
+
# In .env file
|
|
460
|
+
BOT_PROFILE_ID=/path/to/valid/profile.enc:Profile Name:Description
|
|
461
|
+
|
|
462
|
+
# For Docker, mount profile directory
|
|
463
|
+
-v /path/to/profiles:/profiles:ro
|
|
464
|
+
-e "BOT_PROFILE_ID=/profiles/your_profile.enc:Name:Description"
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
**How to verify profile is working**:
|
|
468
|
+
```ruby
|
|
469
|
+
# Create session with BotBrowser profile
|
|
470
|
+
create_session(browser_id: "botbrowser", bot_profile_id: "your_profile_id")
|
|
471
|
+
|
|
472
|
+
# Test sequence of operations (this fails with invalid profiles)
|
|
473
|
+
navigate(url: "https://example.com", session_id: "...")
|
|
474
|
+
get_text(selector: "h1", session_id: "...") # ← Fails here if profile is invalid
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
**If successful**:
|
|
478
|
+
- ✓ No popup appears on browser startup
|
|
479
|
+
- ✓ Navigation completes
|
|
480
|
+
- ✓ Subsequent operations work (get_text, screenshot, etc.)
|
|
481
|
+
- ✓ Session persists across multiple tool calls
|
|
482
|
+
|
|
483
|
+
**Getting BotBrowser profiles**:
|
|
484
|
+
- Trial profiles: Included with BotBrowser download packages
|
|
485
|
+
- Premium profiles: Contact BotBrowser support (botbrowser@bk.ru or @botbrowser_support on Telegram)
|
|
486
|
+
- Profile version must match BotBrowser version
|
|
487
|
+
|
|
488
|
+
### Error: `Failed to load profile`
|
|
489
|
+
|
|
490
|
+
**Cause**: Invalid or encrypted profile
|
|
491
|
+
|
|
492
|
+
**Solution**:
|
|
493
|
+
```bash
|
|
494
|
+
# Verify profile exists
|
|
495
|
+
ls /path/to/profile.enc
|
|
496
|
+
|
|
497
|
+
# Set profile
|
|
498
|
+
BOT_PROFILE_US=/path/to/profile.enc:US Chrome:US fingerprint
|
|
499
|
+
|
|
500
|
+
# Check profile is encrypted (.enc extension)
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
### BotBrowser session slower than regular Chrome
|
|
504
|
+
|
|
505
|
+
**Expected behavior**: Anti-detection adds overhead
|
|
506
|
+
|
|
507
|
+
**Mitigation**:
|
|
508
|
+
- Use regular Chrome for non-protected sites
|
|
509
|
+
- Increase timeout for BotBrowser sessions
|
|
510
|
+
- Use separate session for BotBrowser
|
|
511
|
+
|
|
512
|
+
---
|
|
513
|
+
|
|
514
|
+
## Performance Issues
|
|
515
|
+
|
|
516
|
+
### High memory usage
|
|
517
|
+
|
|
518
|
+
**Cause**: Multiple sessions or memory leak
|
|
519
|
+
|
|
520
|
+
**Solution**:
|
|
521
|
+
```bash
|
|
522
|
+
# Monitor sessions
|
|
523
|
+
list_sessions()
|
|
524
|
+
|
|
525
|
+
# Close unused sessions
|
|
526
|
+
close_session(session_id: "...")
|
|
527
|
+
|
|
528
|
+
# Enable headless mode
|
|
529
|
+
BROWSER_HEADLESS=true ruby bin/ferrum-mcp
|
|
530
|
+
|
|
531
|
+
# Limit concurrent sessions (manual until v1.1)
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### Slow tool execution
|
|
535
|
+
|
|
536
|
+
**Cause**: Network latency, page load time, or timeouts
|
|
537
|
+
|
|
538
|
+
**Solution**:
|
|
539
|
+
```ruby
|
|
540
|
+
# Increase timeout
|
|
541
|
+
create_session(timeout: 120)
|
|
542
|
+
|
|
543
|
+
# Use headless mode (faster)
|
|
544
|
+
create_session(headless: true)
|
|
545
|
+
|
|
546
|
+
# Navigate with faster wait condition
|
|
547
|
+
navigate(url: "...", wait_until: "domcontentloaded", session_id: "...")
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### CPU usage spikes
|
|
551
|
+
|
|
552
|
+
**Cause**: Multiple browsers or heavy page rendering
|
|
553
|
+
|
|
554
|
+
**Solution**:
|
|
555
|
+
- Limit concurrent sessions
|
|
556
|
+
- Use headless mode
|
|
557
|
+
- Close sessions when done
|
|
558
|
+
- Monitor: `htop` or Activity Monitor
|
|
559
|
+
|
|
560
|
+
---
|
|
561
|
+
|
|
562
|
+
## Logging and Debugging
|
|
563
|
+
|
|
564
|
+
### Enable debug logging
|
|
565
|
+
|
|
566
|
+
```bash
|
|
567
|
+
LOG_LEVEL=debug ruby bin/ferrum-mcp
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
### Check logs
|
|
571
|
+
|
|
572
|
+
```bash
|
|
573
|
+
# View logs
|
|
574
|
+
tail -f logs/ferrum_mcp.log
|
|
575
|
+
|
|
576
|
+
# Search for errors
|
|
577
|
+
grep ERROR logs/ferrum_mcp.log
|
|
578
|
+
|
|
579
|
+
# Search for specific session
|
|
580
|
+
grep "session-123" logs/ferrum_mcp.log
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
### Log levels
|
|
584
|
+
|
|
585
|
+
- `DEBUG`: Detailed execution traces
|
|
586
|
+
- `INFO`: Session lifecycle, tool execution (default)
|
|
587
|
+
- `WARN`: Degraded functionality
|
|
588
|
+
- `ERROR`: Failures requiring attention
|
|
589
|
+
|
|
590
|
+
### Common log errors
|
|
591
|
+
|
|
592
|
+
**`ERROR -- : Browser startup failed`**
|
|
593
|
+
→ Check browser path and installation
|
|
594
|
+
|
|
595
|
+
**`ERROR -- : Session not found`**
|
|
596
|
+
→ Session expired or invalid session_id
|
|
597
|
+
|
|
598
|
+
**`WARN -- : Session idle timeout reached`**
|
|
599
|
+
→ Normal, session auto-closed after 30 minutes
|
|
600
|
+
|
|
601
|
+
**`ERROR -- : Stale element reference`**
|
|
602
|
+
→ Tool automatically retries, usually recovers
|
|
603
|
+
|
|
604
|
+
### Enable RSpec verbose output
|
|
605
|
+
|
|
606
|
+
```bash
|
|
607
|
+
bundle exec rspec --format documentation
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
### Test specific scenario
|
|
611
|
+
|
|
612
|
+
```bash
|
|
613
|
+
# Create test script
|
|
614
|
+
cat > test_scenario.rb << 'EOF'
|
|
615
|
+
require_relative 'lib/ferrum_mcp'
|
|
616
|
+
|
|
617
|
+
config = FerrumMCP::Configuration.new
|
|
618
|
+
server = FerrumMCP::Server.new(config)
|
|
619
|
+
|
|
620
|
+
# Your test code here
|
|
621
|
+
session_id = server.execute_tool('create_session', { headless: false })
|
|
622
|
+
puts "Session created: #{session_id}"
|
|
623
|
+
EOF
|
|
624
|
+
|
|
625
|
+
ruby test_scenario.rb
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
---
|
|
629
|
+
|
|
630
|
+
## Getting Help
|
|
631
|
+
|
|
632
|
+
If you're still stuck:
|
|
633
|
+
|
|
634
|
+
1. **Check documentation**:
|
|
635
|
+
- [Getting Started](GETTING_STARTED.md)
|
|
636
|
+
- [API Reference](API_REFERENCE.md)
|
|
637
|
+
- [Configuration](CONFIGURATION.md)
|
|
638
|
+
|
|
639
|
+
2. **Search existing issues**:
|
|
640
|
+
- [GitHub Issues](https://github.com/Eth3rnit3/FerrumMCP/issues)
|
|
641
|
+
|
|
642
|
+
3. **Enable debug logging**:
|
|
643
|
+
```bash
|
|
644
|
+
LOG_LEVEL=debug ruby bin/ferrum-mcp
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
4. **Create a minimal reproduction**:
|
|
648
|
+
- Simplest possible steps to reproduce
|
|
649
|
+
- Include error messages
|
|
650
|
+
- Share logs (redact sensitive info)
|
|
651
|
+
|
|
652
|
+
5. **Open an issue**:
|
|
653
|
+
- Use bug report template
|
|
654
|
+
- Include environment details
|
|
655
|
+
- Attach logs and screenshots
|
|
656
|
+
|
|
657
|
+
6. **Contact**:
|
|
658
|
+
- Email: [eth3rnit3@gmail.com](mailto:eth3rnit3@gmail.com)
|
|
659
|
+
|
|
660
|
+
---
|
|
661
|
+
|
|
662
|
+
## Quick Diagnostic Checklist
|
|
663
|
+
|
|
664
|
+
Before opening an issue, verify:
|
|
665
|
+
|
|
666
|
+
- [ ] Ruby version ≥ 3.2: `ruby --version`
|
|
667
|
+
- [ ] Dependencies installed: `bundle install`
|
|
668
|
+
- [ ] Chrome installed: `which google-chrome` or `which chromium-browser`
|
|
669
|
+
- [ ] Port available: `lsof -i :3000`
|
|
670
|
+
- [ ] Logs checked: `tail -f logs/ferrum_mcp.log`
|
|
671
|
+
- [ ] Configuration valid: Check `.env` file
|
|
672
|
+
- [ ] RuboCop passes: `bundle exec rubocop`
|
|
673
|
+
- [ ] Tests pass: `bundle exec rspec`
|
|
674
|
+
|
|
675
|
+
---
|
|
676
|
+
|
|
677
|
+
**Last Updated**: 2025-01-23
|