The tool set is Playwright-shaped — selectors, element states, generated locators — with the session made explicit in every signature rather than kept as hidden server state, which is what lets a run keep a signed-in tab and a scratch tab side by side. browser_evaluate runs arbitrary JavaScript in the page context, so a session is exactly as trusted as the page it is pointed at, and browser_screenshot is available but browser_snapshot is the cheaper way to answer most questions about page state.
A browser automation server built around numbered sessions, 26 tools spanning session lifecycle, navigation, element interaction, keyboard and mouse input, and page inspection.
- Concurrent sessions as the organising idea: start_session names one and chooses a provider, get_sessions lists what is open, close_session takes a numeric session ID and close_all_sessions ends them all
- Selector-driven interaction — browser_click, browser_fill, browser_fill_form for several fields in one call, browser_select_option, browser_hover, browser_drag and browser_upload_file
- Three ways to read a page: browser_snapshot returns a structured snapshot bounded by maxDepth and maxChildren, browser_get_page_structure a readable summary, browser_dom_query an element's presence, count and state without waiting
- Coordinate-level input for what selectors cannot reach: browser_mouse_move, browser_mouse_click_xy, browser_mouse_drag, browser_keyboard_press for key chords and browser_keyboard_type with a per-character delay
- browser_generate_locator, which suggests locators for an element — the piece that makes a broken selector fixable inside the same session
- Explicit waiting rather than sleeps scattered through a script: browser_wait_for_selector waits for a state, browser_wait_for_timeout waits a set number of milliseconds
The browser provider that start_session opens against, and the numeric session ID it returns — every other tool takes it as sessionId. Apache-2.0 licensed.
One command — npx parallel-browser-mcp@latest
