veilbrowser
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| VEIL_CHROME | No | Path to the Chrome/Chromium executable. If not set, the server assumes Chrome/Chromium is on the system PATH. | |
| VEIL_CDP_URL | No | A host:port or WebSocket URL of an already running Chrome instance with remote debugging enabled. When set, the MCP server attaches to that browser instead of launching its own. | |
| VEIL_HEADLESS | No | Set to '1' to run the browser in headless mode. If unset, the server runs in headful mode (using an auto-managed Xvfb when no display is available) for the strongest stealth fingerprint. |
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 | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| veil_gotoA | Navigate the browser to a URL (launches Chrome on first call). waitUntil 'load' (default) or 'networkidle' (wait until no network for ~500ms — better for SPAs that fetch after load). |
| veil_reloadA | Reload the current page. waitUntil 'load' (default) or 'networkidle'. |
| veil_backA | Go back one entry in session history (errors if there's nothing earlier). waitUntil 'load' (default) or 'networkidle'. |
| veil_forwardA | Go forward one entry in session history (errors if there's nothing later). waitUntil 'load' (default) or 'networkidle'. |
| veil_snapshotA | Return the page as a numbered list of interactive elements from the accessibility tree. Use the [ref] numbers with veil_click / veil_fill. No CSS selectors needed. |
| veil_clickB | Click an element by its snapshot ref (human-like mouse path). |
| veil_fillC | Click a field by ref and type text into it (human cadence). |
| veil_typeC | Type text into the currently focused element. |
| veil_selectA | Set a dropdown (by snapshot ref) to a value and fire input+change — the reliable way to drive a native , which click+type can't. Value matches an option's value, then its visible label/text. |
| veil_pressA | Press a single named key on the focused element. Use 'Enter' to submit a search box or form (fill a field, then veil_press Enter). Supported: Enter, Tab, Escape, Backspace, Delete, ArrowUp, ArrowDown, ArrowLeft, ArrowRight, Home, End, PageUp, PageDown. |
| veil_scrollA | Scroll the page by a pixel delta via a real mouse-wheel event (positive dy scrolls down, positive dx scrolls right). Reveals lazy-loaded / off-screen content; re-run veil_snapshot after. |
| veil_set_viewportA | Set the viewport size (and optional deviceScaleFactor / mobile emulation) — the page sees this as window.innerWidth/Height, screen size, and devicePixelRatio. Emulate a phone or force a fixed desktop size for reproducible screenshots. |
| veil_set_user_agentA | Override the User-Agent at runtime, keeping the Sec-CH-UA client-hint brands aligned with it (a bare UA with mismatched hints is a fingerprint tell). |
| veil_set_fingerprintA | Apply a COHERENT fingerprint/profile — UA + client hints + navigator.platform, screen, timezone/locale/geolocation, WebGL vendor/renderer, and seeded canvas/audio noise, all internally consistent. Pass a preset name, random:true (+ optional seed for a deterministic identity), or a full fingerprint object. Call this BEFORE veil_goto for full effect: the injected values take hold on the next navigation; the UA/client-hint/timezone/screen overrides apply immediately. This is coherent identity control, not a magic bullet. |
| veil_block_resourcesA | Block resource loads to speed up scraping and shrink your footprint — by type (image, font, media, stylesheet, script, xhr, fetch, document, websocket, ...) and/or by URL substring. Calls accumulate; coexists with the private-network guard. Lift with veil_unblock_resources. |
| veil_unblock_resourcesA | Lift all resource blocking set by veil_block_resources (leaves the private-network guard untouched). |
| veil_wait_forA | Poll a JS expression in the page until it is truthy, instead of a fixed sleep — e.g. "document.querySelector('.results')". Returns when the condition holds; errors on timeout. |
| veil_wait_for_selectorA | Poll until a CSS selector matches, then return (the selector-shaped convenience over veil_wait_for). Pass visible:true to also require the element to be laid out and not display:none/visibility:hidden. Errors on timeout. |
| veil_click_atA | Trusted click at absolute viewport coordinates (x, y). Use when there is no snapshot ref to target — a canvas, map, or custom widget. |
| veil_get_cookiesA | Return the browser's current cookies as JSON (name, value, domain, path, expires, httpOnly, secure, sameSite, ...). Symmetric with cookie injection. Optionally pass |
| veil_uploadA | Attach local files to a file (even a hidden one) without an OS file picker. Paths must be absolute. selector defaults to the first input[type=file]; pass a specific one if the page has several. |
| veil_upload_via_pickerA | Attach files through a control that opens a file picker (SPAs like Gemini that create the lazily on click). Pass the snapshot ref of the trigger element and absolute file paths. |
| veil_textB | Read one element's rendered text (innerText) by snapshot ref — a price, status, or result cell — without dumping the whole page. |
| veil_attributeA | Read one attribute of an element by snapshot ref (e.g. href, value, aria-label, a data-* attribute). Returns the raw string, or null if absent. |
| veil_screenshotA | Capture a PNG screenshot (returned as an image for vision). Default is the current viewport. Pass a snapshot |
| veil_evalB | Evaluate a JS expression in the page and return the value. |
| veil_pdfA | Render the current page to a PDF and save it to disk — Chrome prints PDF in HEADLESS mode only (VEIL_HEADLESS=1). Pass |
| veil_fedcm_enableA | Arm FedCM interception BEFORE navigating to a site that shows a Google/federated 'one-tap' sign-in on load. Order: veil_fedcm_enable -> veil_goto the sign-in page -> veil_fedcm_signin. (Skip this for an active 'Sign in with Google' button; veil_fedcm_signin arms itself when you pass a triggerRef.) |
| veil_fedcm_signinA | Complete a federated ('Sign in with Google', FedCM) login that Chrome renders as a native chooser no click can reach: waits for the intercepted account chooser, selects an account, and returns it. Pass triggerRef to first click an active sign-in button; omit it for one-tap/passive flows (call veil_fedcm_enable before navigating). accountIndex defaults to 0. |
| veil_closeA | Close the browser. |
| veil_dragA | Drag from one point to another — real mousedown -> mousemove(button held) -> mouseup, not the HTML5 drag events. Use this for 'drag a card onto a canvas' UIs (site/page builders, Kanban boards, sortable lists) whose drop targets don't respond to a plain click. Pass |
| veil_framesA | List cross-origin child iframes discovered on the current page (e.g. a drag-and-drop site builder whose whole canvas is one iframe on a different subdomain). Same-origin iframes don't need this — they already show up in a normal veil_snapshot. Call after veil_goto if a page you expect to interact with returns '(no interactive elements)'. |
| veil_use_frameA | Point every following veil_snapshot/veil_click/veil_fill/veil_type/veil_eval call at one child iframe (index from veil_frames), instead of the main page. Omit index (or pass null) to switch back to the main page. Existing refs are invalidated on switch — call veil_snapshot again after switching. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/acunningham-ship-it/veilbrowser'
If you have feedback or need assistance with the MCP directory API, please join our Discord server