Skip to content

v1.0.0 — PolterTab

Choose a tag to compare

@abhinav162 abhinav162 released this 21 Aug 13:42
· 10 commits to main since this release
6590996

PolterTab lets any AI assistant drive and scrape your existing Chrome profile — no headless browser, no separate automation setup, no re-logging into anything.

A Chrome extension plus an MCP server. The AI acts inside the browser you already use: your real profile, your cookies, your logged-in sessions.

Install

1. The extension

Download poltertab-extension-v1.0.0.zip below and unzip it. Then:

  1. Open Chrome → chrome://extensions/
  2. Enable Developer mode (top right)
  3. Click Load unpacked
  4. Select the unzipped chrome-extension/ directory

2. The MCP server

Requires Node 18+. Clone the repo, install deps, and point your MCP client at the server over stdio:

git clone https://github.com/abhinav162/poltertab.git
cd poltertab && npm install
{
  "mcpServers": {
    "poltertab": {
      "command": "node",
      "args": ["/absolute/path/to/poltertab/mcp-server/index.js"]
    }
  }
}

Restart your AI tool afterwards.

A guided installer — npm install -g poltertab && poltertab setup — is in review and lands in the next release. It configures the MCP server, installs a browser-navigation skill, and updates your CLAUDE.md in one command.

What it does

21 tools, all prefixed browser_: navigate, click, fill, hover, scroll, snapshot, scrape, screenshot, network capture, named tab sessions, and per-site memory. Full table in the README.

Several agents can point at the same browser at once. The first server to claim the WebSocket port serves the extension; the rest proxy through it.

Handles the pages that usually break automation

This release includes the fixes that make real applications reachable rather than just simple pages:

  • Shadow DOM — including closed roots — is pierced automatically, so selectors match inside web components. browser_snapshot descends into them too, so the agent can see what it is expected to target.
  • Cross-frame search — child frames are searched in parallel when the top frame misses, so an element inside a sandboxed iframe is reachable by plain selector. Tested at 21 frames without burning the timeout budget.
  • Late-rendering modals get retried for ~3s, so a dialog that mounts a beat after the click that opened it does not need a manual wait.
  • browser_fill works on textareas and contenteditable, not just <input>. The DOM's value setters are branded to their own interface, and the old code always read the setter off HTMLInputElement — so filling a textarea threw "Illegal invocation" everywhere, and chat composers were unreachable.

Also fixed

  • Content script injection is idempotent. Re-injection compounded: one command fired N clicks and every intercepted response was captured N times over.
  • stdout is pure JSON-RPC. Two console.log calls were corrupting the MCP channel.
  • Fast pages no longer hang for 30s. The load listener was registered after navigation had already started, so a page that finished quickly was never observed completing.
  • output_file works on secondary servers, not just the one holding the port.
  • The options page is reachable, so the WebSocket port is actually configurable.

Tests

65 tests, no framework and no browser needed: npm test. Covers injection idempotence, shadow DOM piercing, cross-frame search, the navigation load race, and the MCP server end to end against a fake extension on a separate port.