DOMShell MCP server
Drive Chrome with filesystem commands (ls, cd, grep, click, type). One MCP tool, multi-agent.
53 stars176 downloads/wk
Reviews
Write oneNobody has reviewed DOMShell yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
DOMShell tools (39, 4 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
domshell_aboutReport DOMShell runtime identity: MCP server version, bridged extension version (from HELLO handshake), whether an extension is currently connected, and connection timestamp. Use this at drive startup to pin-verify what you're actually talking to, and again on any surprising failure (silent shared-fallback, unexpected DOM, missing lane marker) to disambiguate stale-log/wrong-extension issues from
domshell_backNavigate back in browser history. Equivalent to the browser back button. Automatically refreshes the AX tree after navigation. Use this instead of domshell_navigate when returning to a previously visited page — it's faster (uses browser cache) and doesn't require remembering the URL.
domshell_callCall a global JavaScript function by name. Arguments are auto-parsed as JSON if valid, otherwise passed as strings. Write-tier — requires --allow-write. Examples: call getCount call getMessage Agent call resetCount call setConfig {"key": "value"}
domshell_catRead detailed metadata about a DOM element: role, type, AX ID, DOM backend ID, value, child count, text content (textContent), visible text (innerText — only rendered text, respects CSS visibility), and outerHTML snippet.
domshell_cdChange directory — sets your scope for all subsequent commands (ls, find, grep, text all operate relative to current directory). Paths: 'main/form', '..', '~' (browser root), '~/tabs/<id>', '~/tabs/<pattern>', '%here%' (focused tab). When to cd: - cd into a SECTION (article, main, sidebar) to scope find/grep/ls to that area - cd into ~/tabs/<id> to switch between tabs - cd .. to go up when done wi
domshell_clickClick a DOM element. May trigger navigation, form submission, or page changes. The DOM tree auto-refreshes on the next command. After clicking: use domshell_ls or domshell_pwd to verify the page actually changed. Some clicks (like search buttons) may need a domshell_refresh to see updated content. If clicking a search/submit button doesn't navigate, try using domshell_navigate as a fallback.
domshell_closeClose a tab. With no arguments, closes the current tab and returns to browser root. With a tab ID, closes that specific tab. Use after extracting data from a page to keep the tab count manageable.
domshell_diffCompare the current AX tree against the snapshot taken before the last write/navigate action (click, type, submit, select, navigate, open, back, forward, scroll). Shows added, removed, and changed elements. Use after a click or form submission to see exactly what changed on the page instead of re-exploring with ls/find.
domshell_eachwrite actionRun a command across multiple open tabs. Iterates over all non-chrome tabs (optionally filtered by title/URL pattern), switches into each, runs the command, and collects results. Restores the original tab when done. Options: --pattern FILTER Only tabs whose title or URL contains FILTER --limit N Process at most N matching tabs Examples: each eval document.title Title from every tab each --pattern
domshell_evalEvaluate a JavaScript expression in the tab context. Returns the result. WRITE TIER as of 2.0.8 — the expression runs via CDP Runtime.evaluate with no side-effect gate, so any JavaScript can mutate DOM/window/global state. Requires --allow-write, same as domshell_js. Use for one-off expressions (property reads, single-value extractions); prefer domshell_js for multi-statement scripts. Examples: ev
domshell_executewrite actionRun DOMShell commands to browse and read web pages — the primary DOMShell interface. DOMShell maps a page's accessibility tree to a filesystem: containers are directories, interactive elements are files; browser windows and tabs are part of the same hierarchy. Send ONE command, or MULTIPLE commands separated by newlines to run a whole workflow in a single call: open https://example.com cd main tex
domshell_extract_linksExtract all links under the current directory or a named child as a clean numbered list in [text](url) format. Purpose-built for link extraction — returns display text and URLs in one call. Examples: extract_links All links under current directory extract_links main -n 20 First 20 links in 'main' section
domshell_extract_tableExtract a table element as structured markdown or CSV. Reads all rows and cells, returns formatted output. First row is treated as the header. Examples: extract_table table_1234 Markdown table extract_table table_1234 --format csv CSV format extract_table table_1234 -n 10 First 10 rows only
domshell_findDeep recursive search from the CURRENT DIRECTORY downward. Scope matters: cd into a section first, then find, to get only that section's elements (fewer, more relevant results). Returns full paths to matching elements. Key flags: --type ROLE Filter by AX role. Accepts exact roles (link, button, heading, textbox, table, list) AND natural aliases: input→textbox/searchbox/combobox, dropdown→combobox/
domshell_focusFocus an input element. Use before 'domshell_type' to direct keyboard input to the right field.
domshell_forIterate over command output lines. Runs a source command, splits output into lines, and for each line replaces {} in the action template and executes it. Capped at 50 items and 120 seconds. Separator is ' : ' (space-colon-space) to avoid conflicts with URL colons. Examples: for "find --type heading -n 3" : text {} for "eval [...urls].join('\\ ')" : open {}
domshell_forwardNavigate forward in browser history. Only works after a 'back' command. Automatically refreshes the AX tree after navigation.
domshell_functionsList callable global JavaScript functions on the current page. Shows function name, arity (parameter count), and parameter names. Useful for discovering page APIs (e.g. MediaWiki's mw.config.get on Wikipedia). Examples: functions All non-standard window functions functions mw Functions matching 'mw' functions --json Machine-parseable output
domshell_grepSearch for elements matching a pattern. Matches against name, role, and value. Case-insensitive. By default, searches only IMMEDIATE children. Use recursive: true to search all descendants — this is almost always what you want for finding sections or elements by name. grep is the primary section-discovery tool. Its output gives you element names and paths that you then use with cd, text, find, and
domshell_hereJump to the active tab in the last focused Chrome window. Use this to quickly enter whichever tab the user is currently looking at, without needing to know the tab ID.
domshell_jswrite actionExecute arbitrary JavaScript in the current tab and return the result. Use this for complex DOM queries, CSS selector extraction, or any operation that would take multiple DOMShell commands. The code runs in the page context with full DOM access. Promises are automatically awaited. Results are JSON-serialized (truncated at 10000 chars). Common patterns: js document.title js document.querySelectorA
domshell_lsList children of the current directory. In the DOM tree: shows elements as files and directories. At the browser level (~): shows tabs/windows. Flags: -l Long format (more detail per element) --meta Show DOM properties (href, src, id) inline — great for extracting links --text Show visible text preview per element -r Recursive listing -n N Limit to N results --offset N Skip first N children (pagin
domshell_navigateNavigate the current tab to a URL. Automatically rebuilds the accessibility tree after navigation completes. Requires a tab context (cd into a tab first). Use this to go to a specific website without opening a new tab.
domshell_openOpen a URL in a new tab and enter it (path becomes ~/tabs/<id>). Automatically builds the accessibility tree after page loads. Works from any location. After opening a page, a typical extraction workflow is: 1. open URL 2. find the section you need (find --type heading, or grep section_name with recursive: true) 3. cd into the container 4. text (for content) or find --type link --meta (for links)
domshell_pwdPrint the current working directory path in the DOM tree.
domshell_readStructured subtree extraction — returns the hierarchy of elements under the current directory or a named child, with roles, names, and values in one call. Think of it as 'tree' + 'cat' combined: you get the structure AND the content. Excellent for tables, lists, and nested sections. A single read on a table returns all rows and cells with their roles and values, replacing N separate text calls. Fl
domshell_refreshForce re-fetch the Accessibility Tree. Use after page navigation or significant DOM changes. Note: the tree also auto-refreshes when changes are detected.
domshell_screenshotCapture a PNG screenshot of the current tab. Returns the image for visual inspection. Useful for understanding page layout on unfamiliar sites — one screenshot can replace multiple exploration calls (tree, ls, find) by showing you exactly what the page looks like.
domshell_scriptSave and run multi-command scripts. Scripts persist across service worker restarts. Subcommands: script list List saved scripts script save <name> cmd1 ; cmd2 Save commands (separated by ' ; ') script show <name> Show commands in a script script run <name> [args...] Execute with $1, $2 variable substitution script delete <name> Delete a script IMPORTANT: Multi-word arguments for 'script run' MUST
domshell_scrollScroll the page or scroll a specific element into view. Use this when content is below the fold or when you need to reach elements not currently visible. Modes: scroll down [N] Scroll page down by N viewport heights (default: 1) scroll up [N] Scroll page up by N viewport heights (default: 1) scroll element_name Scroll a specific element into the center of the viewport Returns current scroll positi
domshell_selectSelect an option from a <select> dropdown element. Matches by option value first, then by visible text (case-insensitive). Dispatches change and input events to trigger form updates. Examples: select language_dropdown en select country_select United States
domshell_submitwrite actionAtomic form submission — focuses input, clears existing value, types new value, then submits (clicks button or presses Enter). Replaces the 3-step focus → type → click pattern in one reliable call. Examples: submit search_input 'machine learning' Type and press Enter submit search_input 'machine learning' --submit search_btn Type and click button
domshell_tabsList all open browser tabs with their IDs, titles, URLs, and window info. Use this to find the right tab before switching. Equivalent to 'ls ~/tabs/'.
domshell_textExtract ALL text content from the current directory or a named child, including every descendant. Returns full textContent in a single call. The name parameter lets you read any child without cd'ing into it first: text paragraph_2994 Read a paragraph's text without cd'ing into it text table_1234 Read an ENTIRE table (all rows, all cells) in one call text list_5678 Read all list items at once text
domshell_treeShow a tree view of the current directory in the DOM, displaying the hierarchy of elements with type prefixes [d]=directory, [x]=interactive, [-]=static.
domshell_typeType text into the currently focused element. Use domshell_focus first to target an input field. For search forms: after typing, you may need to either: 1. click the submit/search button, OR 2. type '\ ' to simulate pressing Enter If the page doesn't navigate after form submission, use domshell_navigate as a fallback to go to the expected URL directly.
domshell_waitWait for an element to appear in the AX tree. Polls the tree every 500ms until the element is found or timeout is reached. Use after clicks or navigation that trigger async content loading (SPAs, AJAX). Examples: wait results_list Wait for search results wait submit_btn --type button Wait for a button to appear wait loading_spinner --timeout 10 Wait up to 10 seconds
domshell_watchRe-run a command periodically and collect results. Useful for monitoring dynamic content changes within a single tool call instead of making N separate calls. Options: --interval N Seconds between runs (default: 2, min: 0.5) --times N Number of iterations (default: 5, max: 100) --until-change Stop early when output differs from previous iteration Total runtime capped at 120 seconds. Examples: watc
domshell_whoamiCheck authentication status by examining cookies for the current page. Shows session cookies and expiry.
Public scan report
scanner v0.1.9 · 2026-09-23 · same rubric, same numbers if you re-run it
- Code scan9 source files scanned; 9 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 40 days ago12/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
What the publisher says
From the DOMShell repository's README, as published. We do not edit it. Read it on GitHub
DOMShell
| |
___|_|___
|___|_|___|
| | | |
|___|_|___|
/ | | \
/ | | \
|____|_|____|
| |
| DOMSHELL |
| |
|___________|
|###########|
|###########|
\#########/
\_______/
██ ██ ██ ███████
██ ██ ██ ███
███████ ██ ██
██░░░██ ██ ██
██ ██ ██ ██
░░ ░░ ░░ ░░
███████ ██ ██ ███████
███ ███████ ██░░░░░
███ ██░░░██ █████
███ ██ ██ ██░░░
███ ██ ██ ███████
░░░ ░░ ░░ ░░░░░░░
██████ ██████ ███ ███ ██
██ ██ ██ ██ ████ ████ ██
██ ██ ██ ██ ██ ████ ██ ██
██ ██ ██ ██ ██ ██ ██ ░░
██████ ██████ ██ ██ ██
░░░░░░ ░░░░░░ ░░ ░░ ░░The browser is your filesystem. A Chrome Extension that lets AI agents (and humans) browse the web using standard Linux commands — ls, cd, cat, grep, click — via a terminal in the Chrome Side Panel.
Install from Chrome Web Store | npm package | Read the blog post | Project home
DOMShell maps the browser into a virtual filesystem. Windows and tabs become top-level directories (~). Each tab's Accessibility Tree becomes a nested filesystem where container elements are directories and buttons, links, and inputs are files. Navigate Chrome the same way you'd navigate /usr/local/bin.
Why
AI agents that interact with websites typically rely on screenshots, pixel coordinates, or brittle CSS selectors. DOMShell takes a different approach: it exposes the browser's own Accessibility Tree as a familiar filesystem metaphor.
This means an agent can:
- Browse tabs with ls ~/tabs/ and switch with cd ~/tabs/123 instead of guessing which tab is active
- Explore a page with ls and tree instead of parsing screenshots
- Navigate into sections with cd navigation/ instead of guessing coordinates
- Act on elements with click submit_btn instead of fragile DOM queries
- Read content with cat or bulk-extract with text instead of scraping innerHTML
- Search for elements with find --type combobox instead of writing selectors
The filesystem abstraction is deterministic, semantic, and works on any website — no site-specific adapters needed.
Installation
Chrome Web Store (Recommended)
Install DOMShell directly from the Chrome Web Store. No build step required.
From Source
git clone https://github.com/apireno/DOMShell.git
cd DOMShell
npm install
npm run buildLoad into Chrome
- Open chrome://extensions/
- Enable Developer mode (toggle in top right)
- Click Load unpacked
- Select the dist/ folder
- Click the DOMShell icon in your toolbar — the side panel opens
Usage
Getting Started
Open any webpage, then open the DOMShell side panel. You'll see a terminal:
╔══════════════════════════════════════╗
║ DOMShell v1.1.0 ║
║ The browser is your filesystem. ║
╚══════════════════════════════════════╝
Type 'help' to see available commands.
Type 'tabs' to see open browser tabs, then 'cd tabs/<id>' to enter one.
dom@shell:~$You start at ~ (the browser root). Jump straight to the active tab with here, or explore:
dom@shell:~$ ls
windows/ (2 windows)
tabs/ (5 tabs)
dom@shell:~$ here
✓ Entered tab 123
Title: Google
URL: https://google.com
AX Nodes: 247Browsing Tabs and Windows
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Install directly
Runs npx -y @apireno/domshell on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add domshell -- npx -y @apireno/domshell
DOMShell: common questions
- Is DOMShell MCP server safe?
- Yes, by our scan: it is graded A (88/100). Read the DOMShell safety report
- How do I install DOMShell?
- It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
- Does DOMShell need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is DOMShell maintained?
- The last commit was 41 days ago (2026-08-14). The latest release is v2.0.10.
- What can I use instead of DOMShell?
- Servers from other publishers that do the same job: chrome-mcp server, Ridealong MCP server and Argent MCP server. Compare all DOMShell alternatives.
Alternatives to DOMShell
Same job from other publishers: the closest match first, then the best rated.
- chrome-mcpDrive your real Chrome over MCP: real logins and cookies, multi-tab automation, deny-all by default.not reviewedGrowingA
- RidealongWatch your AI drive a real Chrome live, point, approve, or take the wheel from your phone.not reviewedGrowingA
- ArgentDrive iOS Simulators, Android emulators, TVs and Electron/web apps from your coding agentnot reviewedWidely usedA
Flutter MCP ToolkitInspect and drive Flutter debug apps/games: semantic snapshots, search, and custom client toolsnot reviewedGrowingA- SeekstoneFilesystem-direct Obsidian MCP server — search and edit your vault with low context-tax.not reviewedGrowingA