vibatchium
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| VIBATCHIUM_SESSION | No | Active session resolution: `--session FLAG` → `$VIBATCHIUM_SESSION` env → `~/.config/vibatchium/active-session` → `default`. | default |
| VIBATCHIUM_IDLE_FREEZE | No | Set to '0' to disable freezing of idle session renderer processes. Default is enabled. | 1 |
| VIBATCHIUM_SECRETS_KEY | No | Optional key for the encrypted credential vault. If not set, the OS keyring is used. | |
| VIBATCHIUM_MAX_SESSIONS | No | Cap on number of parallel browser sessions. Default is 8. | 8 |
| VIBATCHIUM_IDLE_FREEZE_AFTER | No | Seconds with no verb before a launched session's renderer processes are SIGSTOPped. Default is 90. | 90 |
| VIBATCHIUM_SESSION_RAM_FLOOR_MB | No | Minimum free memory required to launch a new session, in MB. If set, daemon refuses to launch a new session when free memory is low. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| startB | Start a browser session (cold-launch real Chrome). |
| attachA | Attach to an existing Chrome via CDP (use after manual login on a Cloudflare-walled site). |
| stopB | Stop the browser session. |
| statusB | Daemon + session status. |
| verify_urlA | Fast pre-check (DNS, optional HTTP HEAD) for a URL before |
| set_log_verbsA | Toggle the daemon's per-verb DEBUG audit log at runtime. Useful for non-trivial runs where you want a full call trail; the toggle's response returns the daemon-log path to tail. |
| exploreA | USE THIS WHEN WebFetch/WebSearch/curl GOT BLOCKED — a 403, a Cloudflare/DataDome "Just a moment..." challenge, a login/paywall, or an empty "JavaScript is required" shell: don't report failure, use this — patchright clears most such walls cold. ONE-CALL 'look at this URL', TEXT-FIRST. Does verify_url → auto-start session if needed (headless) → go → extract text. It does NOT screenshot by default: read and navigate with the returned text/selectors, and a screenshot is captured only as a FALLBACK when the page yields no usable text (canvas/image/blank SPA). This is the 80% case of 'just show me what's on this page' — use it instead of separate start/go/text calls unless you need multi-step interaction. Pass screenshot='always' to force a screenshot, 'never' to suppress even the fallback; when one is captured it comes back as a viewable image, not base64 text. Without an explicit session it runs on an OFF-BUDGET transient ephemeral session (0.7.0) — it never competes with persistent sessions for a slot and is auto-deleted afterward, so it won't touch your 'default' session. |
| expectA | ONE-CALL verification gate. Assert the page reached an expected state — composes element-state / page-text / URL checks plus a native challenge-wall check into a single {passed, failures[]} verdict. Use after an action to confirm it landed (or that you got soft-blocked) instead of stitching wait/text/url/screenshot calls. Every check is optional. |
| goA | Navigate to a URL in the stealth browser, then pair with extract/text/html/map. Reach for this (or explore) when WebFetch/curl was blocked — a 403, a Cloudflare/DataDome "Just a moment..." challenge, a login/paywall, or a JavaScript-only page that returns no usable HTML — or when the page needs a real browser. |
| backC | Browser back. |
| forwardD | Browser forward. |
| reloadB | Reload current page. |
| urlA | Get current URL. |
| titleA | Get current page title. |
| textA | Get inner text (whole page or a target — @eN, @text:Foo, @label:Email, CSS, etc.). |
| htmlB | Get HTML (whole page or a target — @eN, @text:Foo, @label:Email, CSS, etc.). |
| extractA | Clean, LLM-ready Markdown of the page (or a target subtree) — boilerplate (nav/footer/aside/scripts) stripped, headings/links/lists/code preserved. A drop-in for Crawl4AI/Firecrawl-style scraping on the AUTHENTICATED pages those stateless tools can't reach. Returns markdown TEXT (never a base64 screenshot), capped by max_chars. |
| extract_fieldsA | Declarative STRUCTURED extract: pass a {name: selector} map and get back ONE JSON object of values in a single call — against our real authenticated Chrome DOM (a login-walled / SPA page stateless scrapers can't reach). Grammar: |
| detect_formsA | Structured map of every on the page (plus a formless-controls group for SPAs) — against our real authenticated Chrome DOM. Each field carries a ready-to-use |
| candidatesA | List EVERY element a target resolves to, so an ambiguous locator can be disambiguated instead of failing strict mode. Returns {target, count, candidates:[{index, tag, role, name, text, bbox}], truncated}. Act on one with click/fill/type/hover passing |
| attrB | Get an HTML attribute value from an element. |
| valueB | Get the current value of an input/textarea/select. |
| evalA | Evaluate a JS expression in the page (isolated context per Patchright default — |
| mapB | Snapshot actionable elements and assign @eN refs (uses Playwright aria_snapshot mode='ai'). |
| diff_mapC | Diff current snapshot vs the previous one. |
| clickC | Click an @eN ref or CSS selector. |
| dblclickB | Double-click an @eN ref or CSS selector. |
| focusA | Focus an element (without clicking). |
| selectB | Pick option(s) on a ; choose by value/label/index. |
| fillB | Clear an input and fill it with text. With use_secret, value comes from the encrypted vault. |
| typeB | Type text (key-by-key) into an element. |
| hoverC | Hover over an element. |
| pressA | Press a key on a specific element (e.g. Enter on @e3). |
| keysB | Press a key combination (e.g. 'Control+a', 'Enter'). |
| checkC | Check a checkbox / radio. |
| uncheckB | Uncheck a checkbox. |
| scrollC | Scroll the page or a target element into view. |
| is_stateC | Check element state (visible/enabled/checked/...). |
| screenshotA | Capture a screenshot. With no path it returns a viewable image (not base64 text); with a path it saves the PNG and returns the path. With tiles=true it slices a full-page capture into fixed-height tiles written to DISK (returns their paths + count, never base64) — for layout-heavy pages a vision-capable caller then reads tile-by-tile. Prefer reading the page text/selectors first — only screenshot when you actually need the pixels. |
| wait_selectorB | Wait until a CSS selector reaches a state. |
| wait_refC | Wait until an @eN ref reaches a state. |
| wait_urlB | Wait until the URL matches a glob/regex. |
| wait_loadB | Wait for a page load state (load/domcontentloaded/networkidle). |
| wait_fnB | Wait until a JS expression returns truthy. |
| pagesC | List all open browser tabs. |
| page_newA | Open a new tab and switch to it. |
| page_switchC | Switch to tab by index. |
| page_closeA | Close the current tab; the next tab becomes active. |
| findC | Locate elements by semantic strategy (text/label/placeholder/role/testid/xpath/alt/title/css). |
| countB | Count matching elements for a selector or @eN ref. |
| contentC | Replace the page HTML wholesale via page.set_content. |
| framesA | List all live frames with name + url + depth + active flag. |
| frameB | Switch active frame by name or URL substring (omit both to clear). |
| mouseC | Mouse control at pixel coordinates. |
| uploadC | Set files on an input[type=file] target. |
| pdfC | Save the current page as PDF. |
| highlightB | Briefly outline an @eN ref or selector for visual debugging. |
| screenshot_annotateB | Screenshot with @eN bounding-box overlays (vision-LLM friendly). |
| map_compactA | One-line-per-element rendering of the snapshot (token-efficient): |
| observeB | Plan a verb + target for an intent without executing. |
| actD | Observe + execute the resulting plan in one shot. |
| profile_listB | List all profiles and the active one (alias of session_list). |
| profile_newB | Create a new named profile (alias of session_new). |
| profile_useB | Set the active profile (alias of session_use). |
| profile_deleteB | Delete a profile directory (alias of session_delete). |
| session_newA | Create a new on-disk session/profile dir (does NOT launch Chrome). |
| session_listB | List every on-disk session + which are currently running. |
| session_useB | Set the active session (persisted to active-session file). |
| session_switchC | Alias for session_use. |
| session_closeB | Stop Chrome for one session (profile dir preserved). |
| session_close_allC | Stop Chrome for every running session. |
| session_deleteA | Delete a session's profile dir on disk (not active/default). |
| session_leaseA | Acquire/renew an exclusive advisory lease on a running session (0.7.0). Returns a token; present it as the |
| session_releaseA | Release a session lease — present the token via the |
| session_lease_infoB | Report the lease state for a session (never returns the token). |
| cleanA | Housekeeping — reclaim disk from stale profile dirs, superseded Chrome cache dirs, leftover Chrome lock files, regenerable caches, and the daemon log. DRY-RUN by default; pass apply=true to actually delete. Never touches the default/active/running sessions. Returns a per-category {count, bytes} report. |
| humanize_onA | Enable humanlike mouse (Bezier paths, gaussian dwell, sin scroll) for current session. |
| humanize_offB | Disable humanize for current session. |
| humanize_statusA | Report whether humanize is on for current session. |
| vision_clickA | Find a UI element by verbal description (via Claude vision) and click it. Fallback for canvas/Flutter/Unity pages where AX-tree fails. Requires [llm] extra. |
| vision_findA | Return coords + confidence for a described element (no click). |
| vision_typeB | vision_click the described field, then type the given text. |
| vision_statsB | Return cumulative vision API usage (calls, cache_hits, tokens, cost_usd) for session. |
| vision_clear_cacheA | Drop the on-disk vision coords cache. |
| vision_budgetC | Report today + lifetime vision spend vs VIBATCHIUM_VISION_MAX_*_USD caps. reset='today'|'lifetime'|'all' clears the spend log. |
| dismiss_bannersB | Heuristically dismiss cookie/consent/newsletter banners. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 86 tools
Most tools target distinct browser actions, but there are several exact aliases (session_use/session_switch, profile_*/session_*) and overlapping locator/interaction families (find/map/candidates, text/html/extract, click/vision_click) that create real selection ambiguity. The descriptions help, but the boundaries between waits, actions, and extraction modes are not always obvious.
The set predominantly uses imperative snake_case verbs, but it mixes bare noun/state names like url, title, text, html, and status with verb_noun composites like verify_url, extract_fields, wait_selector, and set_log_verbs. The alias families (profile_*, session_*, vision_*) are internally consistent, but the overall pattern is uneven.
86 tools is an extreme count by any agent-facing standard, far beyond the 50+ threshold for extreme mismatch. The count is inflated by aliases, near-duplicate action variants, and overlapping wait/vision/locator families that could be consolidated without losing capability.
The browser automation lifecycle is very thoroughly covered: sessions, navigation, extraction, interaction, waits, frames, tabs, screenshots, forms, and vision fallbacks are all present. Minor gaps exist around standard browser primitives like cookie/localStorage management and network request interception, but they are non-fatal for the advertised stealth-scraping use case.