{"_id":"@agentionai/marshall-plugin-browser","_rev":"2-4374c80cda60cc8fb55d0da39150da25","name":"@agentionai/marshall-plugin-browser","dist-tags":{"latest":"0.3.2"},"versions":{"0.3.0":{"name":"@agentionai/marshall-plugin-browser","version":"0.3.0","_id":"@agentionai/marshall-plugin-browser@0.3.0","maintainers":[{"name":"laurent.zuijdwijk","email":"laurent.zuijdwijk@gmail.com"}],"bin":{"marshall-plugin-browser":"dist/index.js"},"dist":{"shasum":"e2454c544fb2cfe7a9a1376b489ef1a5a128284c","tarball":"https://registry.npmjs.org/@agentionai/marshall-plugin-browser/-/marshall-plugin-browser-0.3.0.tgz","fileCount":30,"integrity":"sha512-E50pi3Cgz5jeJPWGb9SgeDnJIWdAVgGGQl8k2JZlLohV227218MwzN9+LcstUM1HUOJ79XW+bInV/sJuBYvSAA==","signatures":[{"sig":"MEUCIQCrTicWKadPx3oFWAYiieGuxTFysZm7ceUlId6WZdn7hAIgKufsI2gg71QVlamrkKqluO2cqJmJs5OdCIgoxYdtlpY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45192},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./plugin":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"}},"gitHead":"826e9ae64e746c9a995f265eb867e00b3a0e7ba9","scripts":{"test":"node --import tsx/esm --test 'src/**/*.test.ts'","build":"node -e \"fs.rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.build.json","start":"node --import tsx/esm src/index.ts","prepack":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"laurent.zuijdwijk","email":"laurent.zuijdwijk@gmail.com"},"_npmVersion":"10.9.2","description":"Local MCP server that gives the Marshall coding agent browser control and screenshots, backed by a companion Chrome extension.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ws":"^8.21.0","zod":"^4.0.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","@types/ws":"^8.18.1","typescript":"^5.7.0","@types/node":"^25.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marshall-plugin-browser_0.3.0_1788695517749_0.6487846192825422","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"_id":"@agentionai/marshall-plugin-browser@0.3.2","bin":{"marshall-plugin-browser":"dist/index.js"},"dist":{"shasum":"835b859470dffaa3e322fa774f615b370cc45b86","tarball":"https://registry.npmjs.org/@agentionai/marshall-plugin-browser/-/marshall-plugin-browser-0.3.2.tgz","fileCount":35,"integrity":"sha512-zPcAD9ZcKOCIovs9jIfQobeMbQOOQMUZEInjuv+FwE+ipMGbNEh7vNk1SBZvPQhN0nXFFWTSeENzI21w/BAgIQ==","signatures":[{"sig":"MEUCIQCi2m2ezcLgDajZE+85H8yS6QOleKCS2GM5d7hgdWq1vAIgRaW35pL7xKpTn/YRxj4CrPiAuGacXzWYkz9fdBJEsPU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDJLbzi8zszdfBWJNPRiz98sPnBlwdXbS9x97UE84jVBAIhAKNpHm9MHJ9+VUxLqAqtGg1lImj3CWkymUyJ9NNBQRNX"}],"unpackedSize":64590},"name":"@agentionai/marshall-plugin-browser","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./plugin":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"}},"gitHead":"6fe095194611b6ed08973c9c8559680660d79fb3","scripts":{"test":"node --import tsx/esm --test 'src/**/*.test.ts'","build":"node -e \"fs.rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.build.json && node scripts/package-extension.mjs","start":"node --import tsx/esm src/index.ts","prepack":"npm run build","typecheck":"tsc --noEmit"},"version":"0.3.2","_npmUser":{"name":"laurent.zuijdwijk","email":"laurent.zuijdwijk@gmail.com"},"_npmVersion":"11.13.0","description":"Local MCP server that gives the Marshall coding agent browser control and screenshots, backed by a companion Chrome extension.","directories":{},"maintainers":[{"name":"laurent.zuijdwijk","email":"laurent.zuijdwijk@gmail.com"}],"_nodeVersion":"24.16.0","dependencies":{"ws":"^8.21.0","zod":"^4.0.0","express":"^5.2.1","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","fflate":"^0.8.3","@types/ws":"^8.18.1","typescript":"^5.7.0","@types/node":"^25.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/marshall-plugin-browser_0.3.2_1789681085860_0.8218739694473651"}}},"time":{"created":"2026-09-06T11:51:57.569Z","modified":"2026-09-17T21:38:06.162Z","0.3.0":"2026-09-06T11:51:57.883Z","0.3.2":"2026-09-17T21:38:05.965Z"},"description":"Local MCP server that gives the Marshall coding agent browser control and screenshots, backed by a companion Chrome extension.","maintainers":[{"name":"laurent.zuijdwijk","email":"laurent.zuijdwijk@gmail.com"}],"readme":"# @agentionai/marshall-plugin-browser\n\nA local MCP server that gives the Marshall coding agent browser control and\nscreenshots — navigate, click, type, read a page, read its console, and see\nwhat's on screen. It doesn't drive a browser itself; it's the server half of\na pair with [`marshall-browser-extension`](../browser-extension), a Chrome\nextension that does the actual driving.\n\n```\nChrome extension  <—WebSocket (loopback, token-paired)—>  this server  <—MCP over HTTP—>  Marshall\n```\n\n## Run it\n\n### The easy way: let Marshall manage it\n\nInside the `marshall` CLI:\n\n```\n/plugins add browser\n```\n\nThis spawns the server for you (or reuses a compatible running instance),\nhealth-checks it, registers it as an MCP server, and persists its port and\npairing token in your global config. It prefers the remembered port, or 8712\non first launch; if occupied by an older or unrelated server, it automatically\nchooses a free loopback port without stopping that server. Future launches\nreuse the token and prefer the saved port. The first\ntime, it prints the token and a link to a local guided setup page at\n`http://127.0.0.1:<selected-port>/setup`. Open it for a **Download extension ZIP** button\nand step-by-step Chrome/Edge installation instructions; no checkout or build\nis required. You can also [download from the website](https://marshall.agention.ai/docs.html#browser-extension)\nbefore starting Marshall. The website ZIP tracks the latest site deployment;\nthe local ZIP matches your installed plugin. Keep Marshall running while pairing. Extract the ZIP into a\npermanent folder, then use **Load unpacked** on your browser's extensions page\nto select the folder containing `manifest.json`. Pin the extension, open its\npopup, paste the pairing token, set **Advanced: bridge URL** to the URL printed\nby Marshall, and click **Save & connect**. If the port changes, update that URL\nand save again even if already paired; no extension reinstall is required. `/plugins disable browser` stops it and unregisters\nit. `/plugins` (or `/plugins list`) on its own lists what's configured.\n\n### The manual way\n\n```bash\nnpx @agentionai/marshall-plugin-browser\n```\n\nIt prints an MCP endpoint and a one-time pairing token:\n\n```\nmarshall-plugin-browser is running.\n\n  MCP endpoint:  http://127.0.0.1:8712/mcp\n  Pairing token: <random>\n```\n\n1. Add the endpoint to your project's `.marshall/config.json`:\n\n   ```json\n   { \"mcpServers\": [{ \"name\": \"browser\", \"url\": \"http://127.0.0.1:8712/mcp\" }] }\n   ```\n\n2. Open [the guided setup page](http://127.0.0.1:8712/setup) while the\n   server is running (use your server port if changed), download the ZIP,\n   and extract it into a permanent folder. Load\n   the extracted folder into Chrome (`chrome://extensions` → Developer mode\n   → Load unpacked), click its\n   toolbar icon, and paste the pairing token into the popup.\n\nRestarting a manually-run server generates a new token; re-paste it into the\nextension. (The managed path above avoids this by persisting the token.)\n\n### Either way\n\nThe server binds to `127.0.0.1` only. The token is what stops a page from\npairing with the bridge itself — a bare open loopback port would otherwise be\nreachable from any tab's own `fetch`/`WebSocket`.\n\n## Tools\n\n| Tool | What it does |\n|---|---|\n| `browser_navigate` | Navigate the active tab to a URL |\n| `browser_screenshot` | Capture the active tab's visible viewport |\n| `browser_click` | Click the first element matching a CSS selector |\n| `browser_type` | Type into the first input/textarea matching a CSS selector |\n| `browser_press_key` | Press a key (Enter, Escape, Tab, arrows, a character), with optional modifiers |\n| `browser_read_page` | Read the active tab's content as `markdown` (default), `text`, or `html` |\n| `browser_console_logs` | Read recent `console.*` output, uncaught errors and failed resource loads from the active tab |\n\n`browser_read_page`'s `markdown` mode keeps structure — headings, lists,\nlinks with their `href` — at a fraction of `html`'s cost, so the model can\nact on a link without a second `html` read just to find its destination.\n`text` is cheaper still when structure and links don't matter; `html` is the\nfull page markup for when real tags/attributes/classes are needed.\n\nEvery call goes through Marshall's normal MCP approval gate — nothing here\nbypasses it. `browser_screenshot`'s image reaches the model as real vision\ninput (not a wall of base64 text), via Marshall's generic MCP image-result\nsupport (`ToolConfig.attachImages` in `@agentionai/marshall-tools`) — any MCP\nserver returning image content blocks gets this, not just this one.\n\nDeliberately not in v1: multi-tab management, full-page screenshot\nstitching, an arbitrary-JS `eval` tool, and accessibility-tree reading.\n\nThe ZIP is included in the published plugin package and contains no pairing\ntoken. You can download it again while the server is running.\n\n## Development\n\n```bash\nnpm run build -w packages/plugin-browser   # compile\nnpm run test -w packages/plugin-browser    # unit + a real MCP-client end-to-end test\nnpm run start -w packages/plugin-browser   # run from source\n```\n","readmeFilename":"README.md"}