You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
v2.0.0 β MCP-powered browser automation stack for Notion Custom Agents
A hybrid open-source stack: Chromium MV3 extension + always-on local bridge exposing browser capabilities over MCP, with ngrok HTTPS tunneling for cloud agent access.
Persistent Automation Indicator β Badge, glowing border, and "Browser Access" tab group stay visible for the entire automation session (surviving navigations), not just per action; input blocking stays transient so you can still read the page while the agent thinks
Session-Scoped Cleanup β The agent dismisses the indicator with browser-done when finished; fallbacks clear it on MCP session close, bridge disconnect, or 3 minutes of inactivity
First-class Media Controls β fullscreen, play, pause, mute, unmute, PiP, media_state β no DOM button hunting
Real Click Events β PointerEvent + MouseEvent dispatch with coordinates for proper user-activation
Stale Snapshot Detection β Pass snapshotId to browser-act; warns when element IDs are from an outdated snapshot
Tab Groups β Create, manage, and tear down Chrome tab groups for organized automation sessions
Predicate Wait β wait_until polls a JS expression until truthy (e.g. !video.paused)
execute_js Returns Values β Scripts auto-wrapped in return(); objects JSON-serialized; DOM nodes return outerHTML
Smart Screenshot Pipeline β Auto downscale/recompress (JPEG q70, max 1280px), 3MB hard size guard, element_screenshot, screenshot_summary, resource_link mode, auto-tile
Chrome Extension Bridge β MV3 extension communicates via WebSocket to local Node bridge
One-call workflows that run entirely inside the extension, replacing 5-10 manual round-trips:
Skill
Description
youtube_play / google_search
Search + play / search + return top results in one call
fill_and_submit
Fill every named field in a form and submit
scroll_to_bottom / extract_table
Load dynamic content / parse a table to JSON
smart_observe
Fresh a11y snapshot + media state in one call (default observation primitive)
wait_for_idle / watch_dom
Wait for network idle / for a matching DOM mutation
click_reliable / type_reliable
CDP-level input for SPAs with synthetic event systems
π browser-diff (change detection β 1 action)
Action
Description
diff
Returns only { added, changed, removed } since the last snapshot β far cheaper than a full re-snapshot
β browser-done (end automation session)
Action
Description
(call once, when finished)
Dismisses the in-browser "Automation in progress" indicator and releases the Browser Access tab group. Optional reason recorded in the audit log.
πΈ Screenshot Pipeline (v0.5.0)
Screenshots are automatically processed through a smart pipeline to prevent payload size issues:
Downscale + Recompress β Default JPEG quality 70, capped at 1280px on the long edge. Configurable via quality, maxWidth, imageFormat params.
Hard Size Guard β If encoded result exceeds 3MB, progressively downscales until under limit. Adds truncated: true flag.
Element Screenshot β Crop to a single element by elementId from snapshot or manual bbox.
Screenshot Summary β Returns dimensions, file size, and a 256px thumbnail. Agent decides if full image is worth fetching.
Resource Link Mode β returnAs: 'resource_link' saves to temp dir and returns a fetch URI. Keeps step payload tiny.
Auto-Tile β autoTile: true for full-page captures splits into viewport-sized tiles returned as resource_links with a manifest.
Prefer snapshot_tab (a11y) over screenshot for verification β it's faster, smaller, and gives element IDs.
πΈ Snapshot Modes
Mode
Description
a11y_markdown_ids
(preferred) Accessibility tree as Markdown with stable element IDs
semantic_json
Structured JSON with semantic content
sanitized_html
Cleaned HTML (fallback)
screenshot_plus_text
Screenshot + extracted text (vision fallback)
π΅ Automation Indicator (v2.0.0)
While an agent drives the browser, the user always sees what's happening:
Session visuals β On the first action, the tab gets a floating "Browser Access β Automation in progress" badge, a glowing border, and is placed in a blue Browser Access tab group. These persist for the entire task β across actions, agent thinking time, and page navigations.
Transient input lock β Mouse/keyboard on the tab are blocked only around each action (released 2s after), so the user can still scroll and read between steps.
Session end β The agent calls browser-done as its final step to dismiss everything. Fallbacks guarantee cleanup: last MCP session closed, bridge disconnected, tab closed, or 3 minutes without actions.
π‘οΈ Safety & Security
Bearer token auth β Every MCP request requires MCP_TOKEN
Kill switch β Create ~/.mcp_kill file to instantly block all tool calls (503)
Confirmation gate β Set ENABLE_CONFIRMATION_GATE=true to require confirmation for moderate/dangerous actions
Domain allowlist β Navigation restricted to approved domains
Confirmation policy β Dangerous actions can require user approval
Audit log β All actions logged with timestamps and outcomes
Session TTL β MCP sessions auto-expire after 30 minutes
Persistent automation indicator β Badge, glowing border, and "Browser Access" tab group now stay visible for the entire automation session instead of flickering per action (previously torn down 2s after each action). Visuals are re-injected after every page navigation.
Transient input lock β The click/keyboard blocker is decoupled from the session visuals: it engages only around actions and releases 2s after, so users can scroll and read the tab while the agent thinks.
New browser-done tool β Agents call it once as their final step to dismiss the indicator and release the tab group (optional reason recorded in the audit log).
Automatic cleanup fallbacks β The indicator also clears when the client's last MCP session closes, when the bridge disconnects, when the tab closes, or after 3 minutes of inactivity.
Protocol β New END_AUTOMATION / AUTOMATION_ENDED messages between bridge and extension.
Docs β README tool surface now covers browser-skills, browser-diff, and browser-done; agent instructions updated to require a final browser-done call.
v1.0.0 β 2026-05-03
Real click events β click now dispatches PointerEvent + MouseEvent with coordinates (fixes requestFullscreen, clipboard, autoplay-with-sound failing due to missing user-activation)
execute_js returns values β Expressions auto-wrapped in return(); objects JSON-serialized; DOM nodes return outerHTML snippet; undefined explicitly handled
First-class media actions β fullscreen, exit_fullscreen, media_play, media_pause, media_mute, media_unmute, enter_pip, exit_pip, media_state β operate directly on <video> element, no DOM button hunting
mediaState in snapshots β Snapshots now include mediaState when a <video> is detected (paused, muted, volume, currentTime, duration, fullscreen, pip, ytMiniplayer)
Predicate-based wait_until β Pass a JS expression (e.g. !document.querySelector("video").paused) and it polls until truthy or timeout
Stale snapshot detection β Pass snapshotId to browser-act; server warns when it doesn't match the last snapshot for that tab
Tab groups β create_tab_group, add_to_group, ungroup_tabs, list_tab_groups, update_tab_group