Ears everywhere
in your stack.
Fennec is an AI-native developer observability MCP server that gives AI agents full-stack visibility into your development environment — browser, terminal, and processes — all in one unified interface.
AI agents are blind without context
When a developer asks an AI agent "why is my login broken?", the agent has no access to the browser console, network tab, or server terminal. The developer becomes a copy-paste bridge.
# What the AI agent sees without Fennec: "I can't access your terminal" "Please paste the error message" "I don't have browser access" # What the developer sees: ✗ TypeError: jwt.sign is undefined // Browser Console ✗ Error: JWT_SECRET not set in env // Terminal ✗ POST /api/login -> 500 // Network Tab
Installation & Configuration
Get Fennec running in under 2 minutes. No external services, no cloud accounts — everything runs locally.
Quick Install
# Install globally npm install -g @plumpslabs/fennec-cli # Install browser engines (optional) fennec install-browsers # Start the MCP server fennec start
MCP Client Config
Add to your MCP client's config file. Connect via stdio (default) or SSE (--sse).
Works with Claude Desktop, Claude Code, Cline, Cursor, Windsurf:
{
"mcpServers": {
"fennec": {
"command": "fennec",
"args": ["start"]
}
}
}
Required for OpenCode, recommended for Continue.dev:
{
"mcpServers": {
"fennec": {
"command": "fennec",
"args": ["start", "--sse"]
}
}
}
Client compatibility:
| Client | stdio | SSE | Notes |
|---|---|---|---|
| Claude Desktop | ✅ | ✅ | stdio default |
| Claude Code | ✅ | ✅ | stdio default |
| Cline | ✅ | ✅ | stdio default |
| Cursor | ✅ | ✅ | stdio default |
| Windsurf | ✅ | ✅ | stdio default |
| Continue.dev | ⚠️ | ✅ | SSE recommended |
| OpenCode | ✅ | ✅ | stdio default (local build wrapper recommended) |
💡 Run fennec start --sse — Fennec outputs the exact remote config snippet on startup. For OpenCode, you can add it as a local stdio server or add type: remote, url: http://localhost:3333/sse to ~/.config/opencode/opencode.json for SSE.
Quick Start
Once Fennec is running and connected to your AI agent, pipe your server output and let the AI investigate.
# Terminal: Start your app with Fennec watching npm run dev 2>&1 | fennec pipe --name "my-app"
Then ask your AI agent: "Why is my app broken?"
The AI will automatically use Fennec tools to open the browser, check console errors, inspect network requests, correlate with server logs, and report the root cause.
Core Features
165+ MCP tools across 18 categories — browser automation, process management, multi-language debugging, and mobile device control.
Browser Automation
Navigate, click, type, scroll. Full DOM and accessibility tree access with zero-dependency CDP engine.
Console & Network
Real-time console monitoring, network interception, request mocking, and CORS detection.
Debug Engine NEW
Multi-language debugger: V8/CDP, Python, PHP, Java/Kotlin, Go, .NET, Ruby, Rust. Auto-debug with EventBus triggers. 26 tools across 3 levels.
Full-Stack Correlation
Correlate browser errors with server logs. Automatic root cause inference with confidence scoring across 11+ patterns.
Process Management
Spawn, monitor, adopt, and supervise processes. Auto-restart, health checks, flapping detection, and concurrency safety.
Auth & Sessions
Auto-fill login forms, save/load authenticated sessions, multi-user parallel testing. Persist across conversations.
Incident Engine
Rate-limited incident detection via EventBus. NOISY event suppression, auto-decay, cooldown. Structured alerts with suppressed count tracking.
Self-Observability
Time-series trend analysis, memory monitoring, tool call metrics, and diagnose_fennec_health diagnostic tool.
Mobile (ADB)
Android device management: tap, type, swipe, logcat, screenshot, install APK. Wireless ADB support.
AI-Native Debugging for 10+ Runtimes
Fennec's Debug Engine provides three levels of debugging — from passive log analysis to active breakpoint debugging to proactive auto-debug — across JavaScript, Python, PHP, Java/Kotlin, Go, .NET, Ruby, Rust, and more.
Level 1 — Log Debug
Passive error dedup by stack hash, source map resolution, grouped error summaries. Token-efficient: 10 identical errors → 1 entry.
Level 2 — Breakpoint
Set breakpoints, step over/into, inspect variables, evaluate expressions. V8/CDP, Python DAP, PHP DBGp, Java JDWP. Logpoints for non-blocking observation.
Level 3 — Auto-Debug
EventBus-driven: auto-attach debugger on process crash, stderr error, browser error, or 5xx. Structured snapshots with suggested fixes.
Multi-Language Support
| Runtime | Protocol | Status |
|---|---|---|
| Node.js / Browser | V8 Inspector (CDP→DAP) | ✅ |
| Python | debugpy (DAP) | ✅ |
| PHP | Xdebug (DBGp→DAP) | ✅ |
| JVM (Java/Kotlin/Scala) | JDWP→DAP | ✅ |
| Go | Delve (DAP) | ✅ |
| .NET (C#, F#, VB) | NetCoreDbg (DAP) | ✅ |
| Ruby | ruby/debug (DAP) | ✅ |
| Rust / C / C++ / Zig / Swift | lldb-dap | ✅ |
| Dart / Flutter | Dart DAP | ✅ |
Record & Replay (Cassette)
Record MCP tool call sessions and replay them to detect regressions:
# Record a debugging session debug_record_session("login-bug") # ... perform debug steps ... debug_stop_recording() # Replay and compare debug_diff_sessions(cassette_a, cassette_b)
Full-Stack Correlation
The crown jewel of Fennec. A single command correlates browser errors with server logs and process state to identify root causes automatically.
// diagnose_fullstack({ processId: "dev-server" }) { "correlation": { "rootCause": "JWT_SECRET environment variable missing", "confidence": 0.94, "fix": "Add JWT_SECRET to your .env file", "timeline": [ { "t": "+0ms", "layer": "browser", "event": "POST /api/auth/login initiated" }, { "t": "+12ms", "layer": "server", "event": "ERROR: JWT_SECRET not set" }, { "t": "+16ms", "layer": "browser", "event": "TypeError thrown in auth.js:67" } ] } }
Tool Reference
165+ tools organized into 18 categories. Every tool follows MCP conventions with structured Zod schemas and token-efficient responses.
- browser_navigate
- browser_go_back
- browser_go_forward
- browser_reload
- browser_get_current_url
- browser_wait_for_navigation
- browser_click
- browser_type
- browser_select
- browser_hover
- browser_scroll
- browser_press_key
- browser_upload_file
- browser_focus
- browser_clear
- browser_drag_drop
- browser_screenshot
- browser_get_dom_snapshot
- browser_get_accessibility_tree
- browser_find_elements
- browser_get_element_info
- browser_wait_for_element
- browser_get_page_text
- browser_get_page_title
- browser_get_meta
- devtools_get_console_logs
- devtools_clear_console
- devtools_evaluate
- devtools_get_js_errors
- devtools_watch_console
- network_get_logs
- network_get_failed_requests
- network_get_cors_issues
- network_clear_logs
- network_wait_for_request
- network_wait_for_api_response
- network_intercept
- network_remove_intercept
- network_mock_response
- network_get_request_detail
- devtools_get_performance_metrics
- devtools_get_memory_usage
- devtools_get_dom_counters
- devtools_simulate_network
- devtools_start_profiling
- devtools_stop_profiling
- debug_get_errors
- debug_get_error_detail
- debug_investigate
- debug_summary
- debug_logs_since
- debug_configure
- debug_set_breakpoint
- debug_remove_breakpoint
- debug_list_breakpoints
- debug_continue
- debug_step_over
- debug_step_into
- debug_get_variables
- debug_get_pause_state
- debug_evaluate
- debug_set_logpoint
- debug_investigate_runtime
- debug_record_session
- debug_stop_recording
- debug_replay_session
- debug_diff_sessions
- debug_list_cassettes
- debug_auto_report
- debug_auto_history
- debug_auto_configure
- debug_auto_stats
- storage_get_local
- storage_set_local
- storage_remove_local
- storage_clear_local
- storage_get_session
- storage_set_session
- storage_get_cookies
- storage_set_cookie
- storage_delete_cookie
- storage_get_indexeddb
- storage_export_state
- storage_import_state
- auth_fill_login_form
- auth_save_session
- auth_load_session
- auth_list_sessions
- auth_delete_session
- auth_check_logged_in
- tab_new
- tab_close
- tab_list
- tab_switch
- tab_get_current
- context_new
- context_close
- context_rotate
- browser_session_recover
- process_spawn
- process_run_and_wait
- process_list
- process_get_logs
- process_get_status
- process_kill
- process_restart
- process_spawn_tracked
- process_stop_tracked
- process_adopt
- process_get_tracked
- process_wait_for_ready
- process_attach_pid
- process_attach_port
- process_set_group
- process_rename_tracked
- process_cleanup_tracked
- process_clear_logs
- process_send_input
- terminal_watch_file
- terminal_watch_pipe
- terminal_get_logs
- terminal_get_errors
- terminal_list_watchers
- terminal_clear_buffer
- terminal_stop_watcher
- diagnose_page
- diagnose_element
- diagnose_network
- diagnose_auth
- diagnose_fullstack
- diagnose_performance
- diagnose_fennec_health
- scheduler_get_stats
- scheduler_list_rules
- scheduler_trigger_rule
- scheduler_enable_rule
- scheduler_disable_rule
- scheduler_get_last_result
- scheduler_clear_history
- smart_wait
- smart_navigate
- smart_fill_form
- smart_validate_form
- browser_screenshot_annotated
- browser_screenshot_export
- browser_screenshot_baseline
- browser_screenshot_diff
- compare_sessions
- test_with_state
- browser_get_element_component
- tools_help
- planner_execute_goal
- planner_create_plan
- planner_list_plans
- planner_get_plan
- planner_cancel_plan
- recorder_start
- recorder_stop
- recorder_export
- recorder_list
- recorder_capture
- mobile_list_devices
- mobile_tap
- mobile_type
- mobile_swipe
- mobile_keyevent
- mobile_screenshot
- mobile_logcat
- mobile_install_apk
- mobile_launch_app
- mobile_stop_app
- mobile_device_info
- db_connect
- db_disconnect
- db_list
- db_query
- db_schema
- db_tables
- db_ping
- db_explain
- db_stats
See the full tool reference for detailed schemas and examples.