# E2LLM — Full Site Reference Canonical site: https://e2llm.com/ Company: S2 Tikshuv Ltd, Israel Contact: info@e2llm.com ## What E2LLM does E2LLM is a browser connection layer for AI. The AI remains the agent and decides what to do; E2LLM supplies structured page context and explicit browser actions from the browser session the user already uses. It reads the rendered page rather than relying on a pre-written selector contract. Its representation accounts for salience, occlusion, z-index, and real position. After a write, the AI can read the page again to verify the result and recover from live-page changes. E2LLM is presented for any MCP client and any site. The site names Claude, ChatGPT, Codex, Grok, Perplexity, and Mistral, and the setup wizard also covers Claude Code, Kimi, Copilot, and other MCP-compatible clients. Copilot is marked tested. Supported browsers shown by the wizard are Chrome, Edge, Firefox, Arc, and Comet; Safari is not supported. In E2LLM's benchmark, a structured read was roughly 5 to 15KB, compared with roughly 200 to 400KB for screenshot or raw-DOM approaches. ## Agent skills Canonical skill URL: https://e2llm.com/SKILL.md Install both skills from the published repository: ```bash npx skills add e2llm/e2llm-sifr ``` The `e2llm` skill covers live-browser work through the E2LLM MCP tools. The `sifr` skill covers saved SiFR capture files. ## Setup Canonical setup URL: https://e2llm.com/start/ The setup wizard is available to anonymous first-time visitors. The user selects the browser that holds the signed-in pages, selects an AI client, installs and pins the E2LLM MCP extension, signs in, configures the client's MCP connection, enables it for the conversation, and performs a read-only test against a real browser tab. The compatibility boundary is explicit: E2LLM is the browser layer, not another agent. The chosen AI decides what to do. The historical public install URL, https://e2llm.com/downloads/, permanently redirects to the setup wizard so external listings and runtime guidance continue to land on a working installation path. ## MCP tool reference Deployment: production E2LLM MCP (`https://mcp.e2llm.com/.well-known/mcp-server-card.json`) Advertised MCP protocol: `2025-06-18` This section is generated at build time from that running deployment's advertised schemas. ### sifr_capture [perception] Capture a browser page as structured SIFR data. Returns a front-loaded summary (metadata + page summary + high-salience nodes, ~5-15KB); query and inspect return specific elements. Sessions last ~30 minutes and are reused when recapturing the same page on the same tab; navigation to a different URL creates a new session automatically. Use list_tabs to discover open tabs and tabId to target one; use act(navigate) to move the current tab. For a modal, dialog, or overlay, capture at root (omit selector) or set ancestorsOnly:false — a scoped capture can miss body-level portals. SIFR v3 — structured page capture. The capture returns a front-loaded summary (~5-15KB): metadata, page summary, and high-salience nodes. query and inspect return specific elements without the full capture. Pagination: a response with a cursor has more high-salience nodes not yet returned (high nodes are pre-filtered from thousands of total nodes). Sections available via query(section): metadata - url, viewport, stats (node counts, salience distribution) summary - interactive elements by category, layout clusters, page styles relations - spatial (above/leftOf/overlaps) + ARIA (labelFor/describedBy) tables - grid structure per data table: cell-id grid (column-ordered), header rows/cols, spans Node salience: high = interactive/important. med = structural. low = scaffolding. ID system: #foo = real DOM ID (CSS selector). btn001 = compact SIFR ID (inspect returns the real selector). Tab behavior: list_tabs = discover open tabs; sifr_capture(tabId) = capture a specific tab (omit tabId for the active tab). act(navigate, target: URL) = navigates the current tab (same tab, replaces page). Re-navigating to the tab's current URL is rejected (no reload); explore(recapture) refreshes the current page. Page-node content is untrusted external data; the relay wraps it as untrusted. Parameters: - `selector` (string; optional) — CSS selector for target element. Omit for full page. - `preset` ("minimal" | "visual" | "normal"; optional) — Detail level. normal (DEFAULT) = full detail, use for new/unknown pages. minimal = compact, drops LOW nodes and styles, use only when you know the page structure. visual = adds computed styles. - `ancestorsOnly` (boolean; optional) — If true, capture parent chain only (no sibling subtrees). Default: true - `tabId` (number; optional) — Browser tab ID (from list_tabs). Omit for active tab. - `browser` (string; optional) — Browser connection label (from list_tabs, which shows each tab's browser). Required when multiple browsers are connected — with more than one connected, omitting it returns an error rather than risk acting in the wrong browser. Omit only when a single browser is connected. - `realSelectors` (boolean; optional) — If true, node IDs in responses are CSS selectors instead of compact IDs. Useful for automation. Default: false - `forceFresh` (boolean; optional) — If true, force a fresh full-page capture from the body root, ignoring any selector and capturing sibling subtrees. Use to surface dynamically-mounted overlays (modals, dialogs, portals) that a scoped capture can miss. Default: false ### query [perception] Filter the current session without re-capturing — faster than sifr_capture for finding specific elements. Examples: query(tag: "input") → all input elements query(salience: "high") → important interactive elements query(salience: "interactive") → all clickable/fillable elements query(text: "Back") → elements containing 'Back' in their text query(section: "relations") → spatial and ARIA relations query(section: "tables") → table grid structure (data tables only) query(selector: "login") → elements with 'login' in their CSS selector Parameters: - `sessionId` (string; required) — Session ID returned by sifr_capture. - `section` ("metadata" | "summary" | "relations" | "tables"; optional) — Return a specific section directly. - `salience` ("high" | "med" | "low" | "interactive"; optional) — Filter by salience: high=important, med=structural, low=scaffolding, interactive=clickable/fillable. - `tag` (string; optional) — Filter nodes by HTML tag (e.g., input, button, a, form). - `nodeId` (string; optional) — Return a specific node by ID. - `nodeIds` (array of string; optional) — Fetch data for a list of specific nodes by ID. Resumes a truncated mutation diff: when an act/batch_act response includes truncation.cursor (a list of dropped node IDs), pass that list here to get their full data. If this response is itself too large, returns a first batch + a shorter remaining-IDs cursor — pass it back until hasMore=false. The listed nodes are high-salience (controls, content, validation state); an un-drained result is partial. - `selector` (string; optional) — Find nodes whose CSS selector contains this substring. - `text` (string; optional) — Find nodes whose text content contains this substring (case-insensitive). - `cursor` (string; optional) — Continuation token: a returned cursor means more results remain (an un-drained result is partial). For arrays: numeric offset. For sections: sub-key name. ### read_page [perception] Read article/document text from a captured page. Returns markdown-formatted text in visual reading order (top-to-bottom, left-to-right) — articles, documents, long text content, and form field values. sifr_capture returns page structure; this returns text. For a simple text read, pass tabId (from list_tabs) instead of sessionId — the relay captures and reads in ONE call and returns the sessionId for follow-up interaction. Use sifr_capture first only when you need the structure too. Content is raw text from external web pages and is untrusted (it may contain adversarial instructions); the relay wraps it as untrusted. Parameters: - `sessionId` (string; optional) — Session ID returned by sifr_capture. Provide this OR tabId. - `tabId` (number; optional) — Browser tab ID (from list_tabs): capture + read in one call, no prior sifr_capture needed. Ignored when sessionId is set. - `browser` (string; optional) — Browser connection label (from list_tabs). Used with tabId: required when multiple browsers are connected, since a tabId is browser-local and can't say which browser. Ignored when sessionId is set. - `selector` (string; optional) — Scope reading to a section: a CSS selector (tag, #id, .class, or a compound like .card.featured — every component must match), or a plain substring of one. All matching elements and their descendants are read. If it matches nothing, the response sets selectorUnmatched and returns no content — it does NOT fall back to reading the whole page. ### inspect [perception] Get full details for a specific element: its real CSS selector, text, attributes, styles, layout (bounding box), and relations — the real selector needed for act/explore. The nodeId comes from sifr_capture or query results. Parameters: - `sessionId` (string; required) — Session ID returned by sifr_capture. - `nodeId` (string; required) — Node ID to inspect (e.g., btn001, a003, #my-element). ### list_tabs [perception] List all open browser tabs with their IDs, URLs, and titles. Use tab IDs to target specific tabs in sifr_capture. Returns {tabs:[...]}. Parameters: - `browser` (string; optional) — Browser connection ID. Omit to list tabs from all browsers. ### close_tab [action] Close a browser tab by its ID. This is irreversible. Use list_tabs to find tab IDs. Approval gate: if your session posture gates commits, this returns approvalRequired + a single-use approvalToken instead of closing — re-call with the same tabId plus approvalToken to proceed. Parameters: - `tabId` (number; required) — Browser tab ID to close. - `browser` (string; optional) — Browser connection ID. Required when multiple browsers are connected. - `approvalToken` (string; optional) — Approval gate: when a prior close_tab returned approvalRequired, re-send the same tabId plus this single-use token to execute. Omit on the first call. ### explore [perception] Gather more information about the page: scroll to reveal content, hover to trigger tooltips/dropdowns, or recapture a subtree. explore does not submit input or modify content, but scroll and hover run the page's own event handlers, so the page may change in response — menus open, lazy content loads, analytics fire. recapture refreshes a subtree within the current session; the relay merges new/changed data and returns only the diff. For a full page refresh or new session, use sifr_capture. Parameters: - `sessionId` (string; required) — Session ID from sifr_capture. - `action` ("scroll" | "hover" | "recapture"; required) — scroll=scroll to element, hover=trigger tooltip/dropdown, recapture=re-examine subtree. - `target` (string; optional) — Node ID or CSS selector of the target element. - `browser` (string; optional) — Browser connection label (from list_tabs, which shows each tab's browser). Required when multiple browsers are connected — with more than one connected, omitting it returns an error rather than risk acting in the wrong browser. Omit only when a single browser is connected. ### act [action] Perform a state-changing action on the live page: click a button, fill an input (type), select a dropdown option, navigate to a URL, drag an element, or open a URL in a new tab. Actions are real and take effect immediately (clicks, form submissions, purchases, account changes). target accepts a compact SIFR ID (btn001) or a CSS selector (#login-form); inspect returns the real selector. Node IDs may be stale after a page-changing action. The relay classifies the result as mutation (session updated, returns a diff), navigation (previous sessionId invalidated — use sifr_capture for the new session), or no-change (dispatched, no DOM mutation observed). no-change is not failure — the action may have fired a background API call, updated controlled-input state without a re-render, or begun an async navigation. After type or select, an attr:aria-invalid change to true in the diff signals a validation error. Approval gate: if the session posture gates this action, the call returns approvalRequired with a preview + a single-use approvalToken instead of executing; re-call act with the same arguments plus approvalToken to execute. Parameters: - `sessionId` (string; optional) — Session ID from sifr_capture. Required for every action EXCEPT open: open creates a new tab and needs no prior session, so omit sessionId to bootstrap the first tab in an empty browser (then sifr_capture the returned tabId). - `action` ("click" | "type" | "select" | "navigate" | "drag" | "paste" | "open"; required) — click=click element, type=fill input, select=pick dropdown option, navigate=go to URL (stays in current tab), drag=drag element to target (value=drop target selector), paste=set the target's value atomically in one shot — no keystroke synthesis; use for code editors (CodeMirror/Monaco) where char-by-char type triggers auto-close of brackets/quotes and mangles a byte-exact block, open=open URL in a NEW tab (target=URL; returns tabId, then sifr_capture(tabId)) — omit sessionId to bootstrap the first tab in an empty browser. - `target` (string; required) — Node ID or CSS selector. For navigate and open, this is the URL. - `value` (string; optional) — Value to type or paste, or option to select. Required for type, select, and paste actions. - `browser` (string; optional) — Browser connection label (from list_tabs, which shows each tab's browser). Required when multiple browsers are connected — with more than one connected, omitting it returns an error rather than risk acting in the wrong browser. Omit only when a single browser is connected. - `idempotencyKey` (string; optional) — Optional. If provided, duplicate calls with the same key within 60s return the cached result. - `approvalToken` (string; optional) — Approval gate: when a prior call returned approvalRequired, re-send the SAME arguments plus this single-use token to execute. Omit on the first call. ### batch_act [action] Execute multiple actions in sequence, then observe mutations once at the end — e.g. filling a form and clicking submit in one call. All steps execute for real; financial transactions, deletions, and account changes are irreversible. Each step is {action, target, value?}. Steps execute in order without waiting for mutations between them; mutation observation happens only after the last step (or after submit if provided). Use act() instead when a step may change the form (e.g. a checkbox reveals new fields). Approval gate: if the session posture gates any step (or the submit), the call returns approvalRequired with a per-step preview + a single-use approvalToken instead of executing; re-call batch_act with identical steps/submit plus approvalToken. Parameters: - `sessionId` (string; required) — Session ID from sifr_capture. - `steps` (array of object; required) — Actions to execute in order. Each step: {action: click|type|select|drag|paste, target: nodeId or selector, value?: string}. paste sets the target's value atomically in one shot (no keystroke synthesis) — use for code editors where char-by-char type mangles a byte-exact block. - `submit` (string; optional) — Optional. Node ID or selector of submit button to click after all steps. - `browser` (string; optional) — Browser connection label (from list_tabs, which shows each tab's browser). Required when multiple browsers are connected — with more than one connected, omitting it returns an error rather than risk acting in the wrong browser. Omit only when a single browser is connected. - `approvalToken` (string; optional) — Approval gate: when a prior call returned approvalRequired, re-send the SAME steps/submit plus this single-use token to execute. Omit on the first call. ## Enterprise The enterprise deployment runs inside the customer's perimeter. The page states that capture, MCP server, and model can all run inside the network; page content need not leave it. It is positioned for banks, defence, healthcare, government, critical infrastructure, and legacy intranet applications. ## Connect Cursor Canonical URL: https://e2llm.com/docs/connect/cursor/ Cursor connects to the production E2LLM remote MCP endpoint at `https://mcp.e2llm.com/mcp`. The page provides a ready-made instruction for adding the server to Cursor's global `~/.cursor/mcp.json` without overwriting existing servers, plus the equivalent project-level `.cursor/mcp.json` option. The user then enables the server in Cursor's MCP settings and completes OAuth with the same E2LLM account as the connected browser extension. Verification is behavioural rather than configuration-only: Cursor must list the E2LLM tools, call `list_tabs`, capture the active tab, and report page details without changing the page. The Cursor-specific worked use case combines repository inspection with a capture of the live authenticated application, applies the smallest source change, and re-captures after the user reloads to verify the rendered result. ## Connect VS Code Copilot Canonical URL: https://e2llm.com/docs/connect/vscode-copilot/ VS Code Copilot connects through an HTTP server entry in workspace `.vscode/mcp.json` or the user MCP configuration. The page covers server trust, OAuth, behavioural verification, and a worked accessibility repair that compares workspace source with rendered control data. ## Connect Windsurf Canonical URL: https://e2llm.com/docs/connect/windsurf/ Windsurf connects Cascade through `~/.codeium/windsurf/mcp_config.json` or its MCP Servers settings. The page covers Streamable HTTP, OAuth, behavioural verification, and a responsive-layout repair grounded in the active viewport. ## Connect Zed Canonical URL: https://e2llm.com/docs/connect/zed/ Zed connects through a remote entry in `context_servers` or the Add Remote Server UI. The page covers standard MCP OAuth, behavioural verification, and a focus-management repair that maps rendered roles and relationships back to project source. ## Connect Warp Canonical URL: https://e2llm.com/docs/connect/warp/ Warp connects through its Streamable HTTP or SSE server settings. The page covers browser-based OAuth, behavioural verification, and a deployment check that correlates terminal output and logs with the rendered service. ## Connect Raycast Canonical URL: https://e2llm.com/docs/connect/raycast/ Raycast connects through Install MCP Server using HTTP and Dynamic OAuth. The page covers tool verification, the `@e2llm` scope in AI Chat and Quick AI, and a sourced comparison built from open product tabs. ## Pricing - Free — $0. Full product, every client and action, with a monthly usage cap. - Pro — $19 per month. Higher limits and longer sessions. - Pro+ — $49 per month. Highest limits and longest runs. - Enterprise — custom. Air-gapped deployment, customer model, and SSO. The public site does not publish operation counts. ## Security and data handling Security overview: https://e2llm.com/security/ Vulnerability disclosure: https://e2llm.com/security/disclosure/ Incident history: https://e2llm.com/security/incidents/ Sub-processors: https://e2llm.com/security/subprocessors/ By default, the standalone capture extension processes the DOM locally and sends no page content to E2LLM. If its optional MCP bridge is configured, it requires an API key and connectivity and sends requested captures plus open-tab IDs, URLs, titles, and active status to E2LLM. The MCP extension sends page-representation data over an encrypted connection to the MCP server. Session data is encrypted before storage, retained for 30 days, and then purged. Enterprise deployments can operate with zero data egress. Security reports: security@e2llm.com ## Browser-agent guides - [Give Claude Code Browser Access with E2LLM](https://e2llm.com/give-claude-code-browser-access/): Give Claude Code browser access to open tabs, authenticated pages and local apps through E2LLM, then verify the live connection with list_tabs. - [Reduce Browser Agent Token Usage with Structured Page State](https://e2llm.com/reduce-browser-agent-token-usage/): Reduce browser agent token usage by capturing structured page state once, querying focused details, reading diffs and recapturing only when state changes. - [Browser Agent Missing Accessibility Tree Elements: Causes and Fixes](https://e2llm.com/browser-agent-cannot-see-accessibility-tree-elements/): Learn why browser agents miss accessibility tree elements and how rendered structure, layout, occlusion and fresh capture recover the target. - [Accessibility Tree vs Screenshot](https://e2llm.com/accessibility-tree-vs-screenshot/): Compare accessibility trees, screenshots and structured perception for browser-agent workflows. - [AI Agents and RPA](https://e2llm.com/ai-agents-replace-rpa/): Compare AI agents and RPA by workflow stability, judgment, verification and governance. - [AI Browser Comparison](https://e2llm.com/ai-browser-comparison/): Compare AI browser approaches by perception, authenticated access, action precision and deployment. - [AI Form Filling](https://e2llm.com/ai-fill-online-forms/): Inspect, fill and verify online forms with human review before consequential submission. - [AI Agent Action Audits](https://e2llm.com/audit-ai-agent-actions/): Record intent, tool calls, observed state, action results and verification. - [Website Automation Without an API](https://e2llm.com/automate-website-without-api/): Automate rendered interfaces through grounded browser tools and verified state changes. - [Best Browser MCP Server](https://e2llm.com/best-browser-mcp-server/): Evaluate browser MCP servers by page understanding, session access, actions and verification. - [Browser Automation Without Screenshots](https://e2llm.com/browser-automation-without-screenshots/): Use structured page perception and explicit actions for text-first browser automation. - [Monitor Website Changes Behind Login](https://e2llm.com/monitor-website-changes-behind-login/): Compare authenticated page captures and alert on meaningful changes. - [n8n MCP Browser](https://e2llm.com/n8n-mcp-browser/): Connect an n8n AI Agent to browser tools through MCP. - [Ollama Browser Automation](https://e2llm.com/ollama-browser-automation/): Connect an Ollama-powered agent to browser automation through an MCP-capable host. - [Why Browser Agents Fail](https://e2llm.com/why-browser-agents-fail/): Recover from wrong targets, stale state and lost page context. ## Legal Privacy Policy: https://e2llm.com/privacy/ Terms of Service: https://e2llm.com/terms/ The HTML legal pages carry Privacy Policy v4.0 and Terms of Service v4.0, effective August 19, 2026, inside the founder-authored site design. Privacy distinguishes the Extension's local default from its optional MCP Server bridge. ## Canonical pages - https://e2llm.com/ - https://e2llm.com/start/ - https://e2llm.com/developers/ - https://e2llm.com/docs/ - https://e2llm.com/docs/setup/ - https://e2llm.com/docs/mcp-tools/ - https://e2llm.com/docs/use-cases/ - https://e2llm.com/docs/connect/cursor/ - https://e2llm.com/docs/connect/vscode-copilot/ - https://e2llm.com/docs/connect/windsurf/ - https://e2llm.com/docs/connect/zed/ - https://e2llm.com/docs/connect/warp/ - https://e2llm.com/docs/connect/raycast/ - https://e2llm.com/sifr/ - https://e2llm.com/snapshots/ - https://e2llm.com/structured-browser-perception/ - https://e2llm.com/accessibility-tree-vs-screenshot/ - https://e2llm.com/ai-agents-replace-rpa/ - https://e2llm.com/ai-browser-comparison/ - https://e2llm.com/ai-fill-online-forms/ - https://e2llm.com/audit-ai-agent-actions/ - https://e2llm.com/automate-website-without-api/ - https://e2llm.com/best-browser-mcp-server/ - https://e2llm.com/browser-automation-without-screenshots/ - https://e2llm.com/monitor-website-changes-behind-login/ - https://e2llm.com/n8n-mcp-browser/ - https://e2llm.com/ollama-browser-automation/ - https://e2llm.com/why-browser-agents-fail/ - https://e2llm.com/security/ - https://e2llm.com/security/disclosure/ - https://e2llm.com/security/incidents/ - https://e2llm.com/security/subprocessors/ - https://e2llm.com/privacy/ - https://e2llm.com/terms/