Quick Diagnosis
| Symptom | Likely Cause | Section |
|---|---|---|
| Browser doesn’t launch | Puppeteer/Chrome issue | Browser Issues |
| ”No ABP manifest found” | Manifest link missing | Discovery Issues |
| Tools don’t appear | Session initialization failed | Connection Issues |
| Capability fails silently | Returning status instead of data | Capability Issues |
| Permission denied errors | Headless mode or missing focus | Permission Issues |
| Outputs not saved to files | Output directory issue | Data Flow Issues |
Browser Issues
Browser Doesn’t Launch
Symptom:abp_connect fails with “Failed to launch browser”
Causes:
- Chrome/Chromium not installed
- Puppeteer not properly installed
- macOS permissions blocking automation
- System resources exhausted
- System Settings -> Privacy & Security -> Automation
- Allow Terminal/your IDE to control Chrome
Browser Crashes
Symptom: Browser window closes unexpectedly Solutions: 1. Increase timeout:Discovery Issues
”No ABP manifest found”
Symptom:abp_connect returns “No ABP manifest link found”
Diagnosis:
Invalid Manifest
Symptom: “Invalid manifest structure” Diagnosis:Connection Issues
Session Initialization Failed
Symptom:abp_connect succeeds but no dynamic tools appear
Diagnosis:
1. Check browser console:
Open the browser window that appeared and check DevTools console for errors.
2. Check window.abp exists:
In browser console:
useEffect, onMounted, ngOnInit) to set window.abp — they run after hydration, which may be too late. Assign at module scope instead:
abp_call as a fallback:
Even if dynamic tools don’t appear, you can always invoke capabilities using abp_call. Pass the capability name as capability and its arguments as params:
abp_call is always available after a successful abp_connect.
Connection Timeout
Symptom:abp_connect times out
Solutions:
1. Increase timeout:
Capability Issues
Capability Returns Status Message Instead of Data
Symptom: Capability succeeds but returns useless output Example of wrong output:Capability Fails with “INVALID_PARAMS”
Diagnosis: 1. Check capability schema:Permission Issues
”Permission Denied” Errors
Symptom: Capabilities fail withPERMISSION_DENIED error
Common causes:
- Running in headless mode
- Browser window doesn’t have focus
- User hasn’t granted permission
Data Flow Issues
Outputs Not Saved to Files
Symptom: Expected a file path but got inline data or an error Diagnosis:All successful capability results are saved to files. Error responses are the only results returned inline (they are small diagnostic text, not content).
File Not Found After Capability Call
Symptom: Bridge returns{ filePath: "/tmp/output.pdf" } but file doesn’t exist
Diagnosis:
Logging and Debugging
Enable Debug Logging
View Bridge Logs
Bridge logs go to stderr (stdout is JSON-RPC):Browser Console
Open DevTools in the browser window:- Right-click -> Inspect
- Or: Cmd+Option+I (macOS), Ctrl+Shift+I (Windows/Linux)
- JavaScript errors
- ABP runtime errors
- Capability execution logs
Test Capabilities Manually
In browser console:Getting Help
If you’re still stuck:- Check the specification: Protocol Overview
- Review examples: Examples & Tutorials
- Open an issue: Include:
- ABP spec version
- MCP Bridge version (if using)
- Browser version
- Error messages
- Steps to reproduce
- Relevant code snippets
Common Mistakes
For App Developers
- Returning status messages instead of actual data
- Triggering native UI (alert, confirm, window.print)
- Not validating inputs
- Not handling errors gracefully
- Manifest not accessible or invalid
For Client Developers
- Using headless mode when headful is needed
- Not checking
successflag - Not handling retryable errors
- Not routing large outputs to files
- Not cleaning up temporary files
Limitations and Known Issues
These are known limitations of the current MCP Bridge implementation. See MCP Bridge Architecture: Limitations for more detail. One connection at a time. The bridge supports a single browser/session. Connecting to a new app disconnects from the current one. There is no session pooling. Headful mode required. Many ABP capabilities (authenticated sessions, GPU/WebGPU, permissions prompts, downloads) require a visible browser window. Headless mode (ABP_HEADLESS=true) will work for basic capabilities but not for the features that make ABP valuable.
Dynamic tool registration is unreliable. Claude Code does not reliably expose dynamically registered MCP tools to the LLM. Use abp_call as the reliable fallback — it can invoke any capability by name.
Elicitation is v1 (auto-respond). When an ABP app requests input from the agent (elicitation), the bridge auto-responds with defaults or cancels. Full support for routing elicitation requests to the user via MCP sampling is planned for a future version.
Print override timing. The BrowserEventGuard overrides window.print() via page.evaluate() after the page has loaded. If the app captures a reference to window.print during its initial script execution (before the guard attaches), the override won’t intercept the call. The fix is to use page.evaluateOnNewDocument() — this is tracked as a pending improvement.
Browser profile. The bridge launches Chromium with a fresh profile each time. Authenticated sessions (cookies, localStorage) from the user’s regular browser are not available.
Next Steps
Building ABP Web Apps
Avoid common app pitfalls
MCP Bridge Quick Start
Proper setup guide
Examples
Working code to compare against
API Reference
Authoritative reference