@agent360/browser-mcp
Advanced tools
+6
-1
@@ -88,3 +88,3 @@ #!/usr/bin/env node | ||
| 6. The extension "Agent360 Browser MCP" appears with a puzzle icon | ||
| 7. Restart Claude Code — 28 browser tools are now available! | ||
| 7. Restart Claude Code — 34 browser tools are now available! | ||
@@ -97,2 +97,7 @@ 🔄 Auto-updates (fully automatic): | ||
| 💡 Help shape Browser MCP: | ||
| - Public wishlist: https://github.com/Agent360dk/browser-mcp/blob/main/WISHLIST.md | ||
| - Use-case gallery: https://github.com/Agent360dk/browser-mcp/blob/main/USE_CASES.md | ||
| - Got an idea, bug, or cool thing you built? Just ask Claude — it can draft + submit for you. | ||
| 📖 Docs: https://browsermcp.dev | ||
@@ -99,0 +104,0 @@ `); |
| { | ||
| "manifest_version": 3, | ||
| "name": "Agent360 Browser MCP", | ||
| "version": "1.21.0", | ||
| "description": "Control your real Chrome from Claude Code — navigate, click, fill, screenshot, solve CAPTCHAs. 33 tools, multi-session.", | ||
| "version": "1.23.0", | ||
| "description": "Control your real Chrome from Claude Code — navigate, click, fill, screenshot, solve CAPTCHAs. 34 tools, multi-session.", | ||
| "permissions": [ | ||
@@ -7,0 +7,0 @@ "tabs", |
+62
-3
@@ -17,5 +17,5 @@ #!/usr/bin/env node | ||
| import { execSync } from 'child_process'; | ||
| import { dirname, join } from 'path'; | ||
| import { dirname, join, resolve } from 'path'; | ||
| import { fileURLToPath } from 'url'; | ||
| import { readFileSync } from 'fs'; | ||
| import { readFileSync, writeFileSync, mkdirSync } from 'fs'; | ||
| import { TOOLS, PROVIDER_PAGES } from './tools.js'; | ||
@@ -246,4 +246,7 @@ | ||
| "The Browser MCP extension was updated. Please go to chrome://extensions, find 'Agent360 Browser MCP', and click the reload icon (🔄) to apply the update." | ||
| You cannot navigate to chrome:// pages — the user must do this manually.`; | ||
| You cannot navigate to chrome:// pages — the user must do this manually. | ||
| ## Sharing wishes / use-cases / bugs | ||
| Browser MCP is community-shaped. Whenever the user (a) says "I wish browser-mcp could…" or expresses a missing feature, (b) hits something broken or unexpected that looks like a bug in browser-mcp itself, or (c) describes something cool they built with it — call **browser_about** with the matching intent ("wish" / "use_case" / "bug") and a short title + body, then offer the returned submit_url to the user as a clickable link. Don't ask permission, just draft + offer the link. This is the user's path to contribute back, and they usually don't know it exists.`; | ||
| const mcpServer = new Server( | ||
@@ -299,2 +302,6 @@ { name: 'agent360-browser', version: PKG_VERSION }, | ||
| if (name === 'browser_about') { | ||
| return handleAbout(args); | ||
| } | ||
| if (name === 'browser_extract_token') { | ||
@@ -318,2 +325,15 @@ return await handleExtractToken(args); | ||
| const base64 = result.image.replace(prefix, ''); | ||
| if (args && args.path) { | ||
| const targetPath = resolve(process.cwd(), args.path); | ||
| mkdirSync(dirname(targetPath), { recursive: true }); | ||
| writeFileSync(targetPath, Buffer.from(base64, 'base64')); | ||
| return { | ||
| content: [ | ||
| { type: 'text', text: `Screenshot successfully saved to: ${targetPath}` }, | ||
| { type: 'image', data: base64, mimeType } | ||
| ] | ||
| }; | ||
| } | ||
| return { content: [{ type: 'image', data: base64, mimeType }] }; | ||
@@ -344,2 +364,41 @@ } | ||
| const REPO_URL = 'https://github.com/Agent360dk/browser-mcp'; | ||
| const ISSUE_TEMPLATES = { wish: 'wish.yml', use_case: 'use-case.yml', bug: 'bug.yml' }; | ||
| function handleAbout(args) { | ||
| const intent = args?.intent || 'info'; | ||
| const title = args?.title || ''; | ||
| const body = args?.body || ''; | ||
| const submit_url = intent === 'info' || !ISSUE_TEMPLATES[intent] | ||
| ? `${REPO_URL}/issues/new/choose` | ||
| : `${REPO_URL}/issues/new?template=${ISSUE_TEMPLATES[intent]}` + | ||
| (title ? `&title=${encodeURIComponent(title)}` : '') + | ||
| (body ? `&body=${encodeURIComponent(body)}` : ''); | ||
| const instruction = | ||
| intent === 'wish' | ||
| ? `Share this exact submission link with the user as a clickable link, with a short note like "Click to submit your wish — it'll open a pre-filled GitHub issue you can review before submitting": ${submit_url}` | ||
| : intent === 'use_case' | ||
| ? `Share this exact submission link with the user as a clickable link, with a short note like "Click to share your use-case — pre-filled, you can edit before submitting": ${submit_url}` | ||
| : intent === 'bug' | ||
| ? `Share this exact bug-report link with the user as a clickable link, with a short note like "Click to report — pre-filled, please add reproduction steps before submitting": ${submit_url}` | ||
| : `Browser MCP is community-shaped. Open wishlist: ${REPO_URL}/blob/main/WISHLIST.md · Use-cases: ${REPO_URL}/blob/main/USE_CASES.md · Submit anything: ${REPO_URL}/issues/new/choose`; | ||
| return { | ||
| content: [{ | ||
| type: 'text', | ||
| text: JSON.stringify({ | ||
| name: 'Browser MCP by Agent360', | ||
| version: PKG_VERSION, | ||
| repo: REPO_URL, | ||
| wishlist: `${REPO_URL}/blob/main/WISHLIST.md`, | ||
| use_cases: `${REPO_URL}/blob/main/USE_CASES.md`, | ||
| submit_url, | ||
| instruction, | ||
| }, null, 2), | ||
| }], | ||
| }; | ||
| } | ||
| async function handleExtractToken(args) { | ||
@@ -346,0 +405,0 @@ const { provider, store_in_vault } = args; |
+2
-2
| { | ||
| "name": "@agent360/browser-mcp", | ||
| "version": "1.21.0", | ||
| "description": "Browser MCP — control your real Chrome from Claude Code. 33 tools, CAPTCHA solving, date pickers, autocomplete combobox, overlay dismissal, file upload, multi-session, human-in-the-loop.", | ||
| "version": "1.23.0", | ||
| "description": "Browser MCP — control your real Chrome from Claude Code. 34 tools, CAPTCHA solving, date pickers, autocomplete combobox, overlay dismissal, file upload, multi-session, human-in-the-loop.", | ||
| "mcpName": "io.github.Agent360dk/browser-mcp", | ||
@@ -6,0 +6,0 @@ "type": "module", |
+77
-15
@@ -8,2 +8,3 @@ # Browser MCP by Agent360 | ||
| [](https://modelcontextprotocol.io) | ||
| [](https://chromewebstore.google.com/detail/agent360-browser-mcp/jdehgalffmffhfhmmhaokfbfnafnmgcl) | ||
@@ -14,6 +15,8 @@ **Control your real Chrome from Claude Code — with your logins, cookies, and 2FA.** | ||
| The only browser MCP with **multi-session support** (10 concurrent AI sessions), **human-in-the-loop** (2FA, CAPTCHA, credentials), and **built-in provider integrations** (Stripe, HubSpot, Slack, and 6 more). 29 tools total. | ||
| The only browser MCP with **multi-session support** (10 concurrent AI sessions), **human-in-the-loop** (2FA, CAPTCHA, credentials), and **built-in provider integrations** (Stripe, HubSpot, Slack, and 6 more). 34 tools total. | ||
| ## Install | ||
| ## Install — 2 steps (~60 seconds) | ||
| ### Step 1: Configure the MCP server | ||
| ```bash | ||
@@ -23,12 +26,44 @@ npx @agent360/browser-mcp install | ||
| This copies the Chrome extension to `~/.browser-mcp/extension/` and configures Claude Code automatically. | ||
| This copies the Chrome extension files to `~/.browser-mcp/extension/` and adds the MCP server to your Claude Code config. **You'll see the path to the extension folder printed in the terminal — copy it.** | ||
| Then load the extension in Chrome: | ||
| 1. Open `chrome://extensions` | ||
| 2. Enable **Developer mode** (top right) | ||
| 3. Click **Load unpacked** → select `~/.browser-mcp/extension/` | ||
| 4. Restart Claude Code | ||
| ### Step 2: Load the extension in Chrome | ||
| That's it. 29 browser tools are now available in Claude Code. | ||
| > Chrome won't let extensions install themselves from npm — you load it manually one time. To **update** later, re-run the install command and reload it (see [Keeping it updated](#keeping-it-updated)). Prefer the [Chrome Web Store](#chrome-web-store-one-click-install) install if you'd rather have the extension auto-update. | ||
| 1. **Open Chrome** and type `chrome://extensions` in the address bar | ||
| 2. **Toggle "Developer mode"** ON (top right corner) | ||
| 3. **Click "Load unpacked"** (top left, next to "Pack extension") | ||
| 4. **Navigate to `~/.browser-mcp/extension/`** and click "Select" | ||
| - On Mac: Press `Cmd+Shift+G` in the file picker, paste `~/.browser-mcp/extension/`, press Enter | ||
| - On Windows: Paste `%USERPROFILE%\.browser-mcp\extension\` in the address bar | ||
| - On Linux: Type `~/.browser-mcp/extension/` in the path field | ||
| 5. **Restart Claude Code** so it picks up the new MCP server | ||
| That's it. The Browser MCP icon will appear in your toolbar, and 34 browser tools are now available in Claude Code. | ||
| ### Alternative: Manual zip download (no npm) | ||
| If you don't want to use npm, download the extension directly: | ||
| 1. [Download `browser-mcp-v1.23.0.zip`](https://github.com/Agent360dk/browser-mcp/releases/latest) from the latest GitHub release | ||
| 2. Unzip the file (anywhere — e.g. `~/Downloads/browser-mcp-extension/`) | ||
| 3. Follow Step 2 above, but select the unzipped folder instead of `~/.browser-mcp/extension/` | ||
| 4. Configure Claude Code manually by adding this to your `~/.claude.json` (or run `npx @agent360/browser-mcp install --skip-extension`): | ||
| ```json | ||
| { | ||
| "mcpServers": { | ||
| "browser-mcp": { | ||
| "command": "npx", | ||
| "args": ["@agent360/browser-mcp"] | ||
| } | ||
| } | ||
| } | ||
| ``` | ||
| ### Chrome Web Store (one-click install) | ||
| [**Install from Chrome Web Store →**](https://chromewebstore.google.com/detail/agent360-browser-mcp/jdehgalffmffhfhmmhaokfbfnafnmgcl) | ||
| No Developer mode needed. Then run `npx @agent360/browser-mcp install --skip-extension` to configure Claude Code. | ||
| ## Why This Over Playwright MCP / BrowserMCP? | ||
@@ -49,3 +84,3 @@ | ||
| ## 29 Tools | ||
| ## 34 Tools | ||
@@ -70,3 +105,6 @@ ### Navigation & Content | ||
| | `browser_select_option` | Native `<select>` + custom dropdowns (Angular Material, React Select) | | ||
| | `browser_handle_dialog` | Accept/dismiss alert/confirm/prompt dialogs | | ||
| | `browser_set_combobox` | Autocomplete/combobox: type query → wait for filtered listbox → click option (multi-value chip support). Use when `browser_select_option` fails on lazy-rendered options | | ||
| | `browser_set_date` | Robust date inputs: tries native value-set → masked typing → calendar-picker navigation (MUI/AntD/react-datepicker/Lexical). Use when `browser_fill` fails on date fields | | ||
| | `browser_dismiss_overlays` | Bulk-dismiss popups/modals/tooltips/banners via aria-label/text/×-char heuristics. `non_critical` mode preserves dialogs with form data | | ||
| | `browser_handle_dialog` | Accept/dismiss native alert/confirm/prompt dialogs | | ||
@@ -111,2 +149,3 @@ ### Tabs & Frames | ||
| | `browser_upload_file` | Upload files to `<input type="file">` via Chrome Debugger API (no dialog) | | ||
| | `browser_drop_file` | Upload via drop-zones: finds hidden `<input type="file">` in target subtree/parent (up to 2 levels). Use when `browser_upload_file` fails because the zone has no visible input | | ||
@@ -154,3 +193,3 @@ ## Multi-Session Support | ||
| index.js # MCP server (stdio) + WebSocket client | ||
| tools.js # 29 tool definitions | ||
| tools.js # 34 tool definitions | ||
| bin/cli.js # Install CLI | ||
@@ -167,8 +206,16 @@ ``` | ||
| ## Auto-Updates | ||
| ## Keeping it updated | ||
| The MCP server runs via `npx @agent360/browser-mcp@latest` — always the latest version from npm. No manual git pulls needed. | ||
| Browser MCP has two parts, and they update independently — how the **extension** updates depends on how you installed it: | ||
| To update the extension: `npx @agent360/browser-mcp install` (re-copies files), then reload in `chrome://extensions`. | ||
| | Part | Install method | How it updates | | ||
| |------|----------------|----------------| | ||
| | **MCP server** | any | **Automatic.** Runs via `npx @agent360/browser-mcp@latest`, so every Claude Code session pulls the newest from npm. Nothing to do. | | ||
| | **Extension** | **Chrome Web Store** | **Automatic.** Chrome updates it in the background (usually within a few hours). Nothing to do. | | ||
| | **Extension** | **Unpacked** (`npx … install` or manual zip) | **Manual.** Chrome never auto-updates a load-unpacked extension. Re-run `npx @agent360/browser-mcp install`, then open `chrome://extensions` → Browser MCP → **↻ reload**. | | ||
| **Not sure which you have?** Open `chrome://extensions` and find Browser MCP. If it shows a **"Loaded from /path/…"** line, it's unpacked (manual updates). If there's no such line, it came from the Chrome Web Store (auto-updates). | ||
| **Want zero-maintenance updates?** Install the extension from the [Chrome Web Store](https://chromewebstore.google.com/detail/agent360-browser-mcp/jdehgalffmffhfhmmhaokfbfnafnmgcl), then run `npx @agent360/browser-mcp install --skip-extension` to wire up just the MCP server. After that, both parts stay current on their own. | ||
| ## Troubleshooting | ||
@@ -194,4 +241,19 @@ | ||
| ## 💡 Help Shape Browser MCP | ||
| Browser MCP is built in the open and shaped by the people using it. | ||
| ### Browse what others want / built | ||
| - 💡 **[Wishlist →](WISHLIST.md)** — features people are asking for | ||
| - 🎯 **[Use-cases →](USE_CASES.md)** — what others have built (LinkedIn ICP scraping, vendor research, daily ops, …) | ||
| ### Contribute in 30 seconds | ||
| - 💡 [Wish for a feature](https://github.com/Agent360dk/browser-mcp/issues/new?template=wish.yml) | ||
| - 🎯 [Share a use-case](https://github.com/Agent360dk/browser-mcp/issues/new?template=use-case.yml) | ||
| - 🐛 [Report a bug](https://github.com/Agent360dk/browser-mcp/issues/new?template=bug.yml) | ||
| Or just **ask Claude** — it knows about the `browser_about` tool and will draft + submit on your behalf when you say things like *"I wish browser-mcp could …"* or *"share my browser-mcp use-case"*. | ||
| ## License | ||
| MIT — [Agent360](https://agent360.dk) |
+29
-2
@@ -32,4 +32,9 @@ /** | ||
| name: 'browser_screenshot', | ||
| description: 'Take a screenshot of the visible area of the current tab. Returns base64 PNG.', | ||
| inputSchema: { type: 'object', properties: {} }, | ||
| description: 'Take a screenshot of the visible area of the current tab. Returns base64 PNG, or saves to disk if path is provided.', | ||
| inputSchema: { | ||
| type: 'object', | ||
| properties: { | ||
| path: { type: 'string', description: 'File path to save the screenshot to (e.g. /path/to/screenshot.png)' }, | ||
| }, | ||
| }, | ||
| }, | ||
@@ -402,2 +407,24 @@ { | ||
| }, | ||
| { | ||
| name: 'browser_about', | ||
| description: 'Returns Browser MCP info and pre-filled URLs the user can click to submit feature wishes, share use-cases, or report bugs. Call this PROACTIVELY whenever the user (a) mentions a feature they wish existed ("I wish browser-mcp could...", "it would be nice if..."), (b) says something is missing, broken, or unexpected, (c) asks how Browser MCP works or who maintains it, or (d) describes something cool they built with browser-mcp. Pass intent="wish" | "use_case" | "bug" | "info" plus an optional title and body, and offer the returned submit_url to the user. Browser MCP is community-shaped — this tool is how the user contributes back.', | ||
| inputSchema: { | ||
| type: 'object', | ||
| properties: { | ||
| intent: { | ||
| type: 'string', | ||
| enum: ['wish', 'use_case', 'bug', 'info'], | ||
| description: 'What the user wants to share. "wish" = feature request, "use_case" = share what they built, "bug" = something broken, "info" = general (default: "info").', | ||
| }, | ||
| title: { | ||
| type: 'string', | ||
| description: 'Optional pre-filled issue title (e.g. "Support hCaptcha v3"). Will be URL-encoded into the submit link.', | ||
| }, | ||
| body: { | ||
| type: 'string', | ||
| description: 'Optional pre-filled body / first-comment draft. Will be URL-encoded into the submit link. Keep it short; user can expand on GitHub.', | ||
| }, | ||
| }, | ||
| }, | ||
| }, | ||
| ]; | ||
@@ -404,0 +431,0 @@ |
Sorry, the diff of this file is too big to display
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 2 instances
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
208859
9.88%3849
7.15%251
32.8%12
9.09%5
25%