Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Agent360 Browser MCP

NPM · @AGENT360/BROWSER-MCP

Drive your real, logged-in Chrome from any AI agent - 40 tools. Needs our Chrome extension too.

+10 this week 91 Trust /100

Last scanned (3 hours ago)

Scores higher than 94% of npm servers

Category Browser Automation

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 30 of 93 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to Agent360dk/browser-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 6 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability64
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 11223 tokens (~280/item across 40 items; 40 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "browser_execute_script" implies "execute" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 41 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 0
    • Stability: 0.97 → pass security
  • 3 Nov 26 +1
    • Package version: 1.30.2 → 1.31.0 functional
  • 2 Nov 26 −1
    • Stability: pass → 0.93 functional
  • 30 Oct 26 +10
    • Known CVEs: unverified → pass ▲ security
    • Dependency health: unverified → 0.85 ▲ functional
  • 29 Oct 26 −11
    • Stability: pass → unverified ▼ security
    • Known CVEs: pass → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Capabilities: pass → unverified ▼ functional
    • Dependency health: 0.85 → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Package version: 1.30.3 → 1.31.0 functional
  • 27 Oct 26 +1
    • Stability: 0.97 → pass security
  • 26 Oct 26 −1
    • Stability: pass → 0.97 functional
  • 17 Oct 26 +1
    • Stability: 0.93 → pass security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed npm/@agent360/browser-mcp@1.31.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo Agent360dk/browser-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/Agent360dk/browser-mcp/.github/workflows/udgivelse.yml@refs/heads/main
Rekor log index 3566329407
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:170a085e7317cdfd8e2e529268d1555127b4370212f57f6dd1d598eb4232d3a0b42ee78c77d5468524c40b6b6c2048415b144c22e1c2ab124f1f33e2b

Background: How many MCP packages publish verified provenance →

Dependencies 93 packages
Packages resolved 93
Stale 30
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 40 exposed · ~8,456 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
browser_about ~332

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. It also lists the Browser MCP installations connected to this chat (installations: the profile name set in the extension popup, the installation id, the version), so you can see which names BROWSER_MCP_PROFILE can choose; it lists nothing before the browser has been used in the chat.

NameTypeReqDescription
bodystring–Optional pre-filled body / first-comment draft. Will be URL-encoded into the submit link. Keep it short; user can expand on GitHub.
intentstring–What the user wants to share. "wish" = feature request, "use_case" = share what they built, "bug" = something broken, "info" = general (default: "info").
titlestring–Optional pre-filled issue title (e.g. "Support hCaptcha v3"). Will be URL-encoded into the submit link.

No output schema declared.

No examples provided.

browser_ask_user ~356

Ask the user to do something or give information. Without fields it shows a small card in the bottom-left corner that the user can drag away while they act on the page (log in, solve a CAPTCHA, give consent); with fields it shows a dialog over the page. The prompt is drawn again after a navigation in the tab, but a prompt with fields ends with action navigated if the tab moves to another origin (another domain, subdomain or port) or, on a local file, to another file. Returns acknowledged, action (done, skip, timeout, tab_closed, replaced when a newer question in the same tab takes over, navigated, or removed_by_page when the page keeps removing the prompt) and, for done, values. The page cannot read the field values, but it can see the keystrokes, so ask only for secrets that belong to the page the tab is on. The tab must show a page that loaded (a web page or a local file): on Chrome's error page or about:blank the call fails at once and shows nothing. It makes the tab the active one in its window and restores a minimized window, but it does not bring Chrome in front of other apps.

NameTypeReqDescription
fieldsarray–Input fields for user to fill in. Each field has: name (key), label (display text), type (text/password/email). Omit for simple "Done/Skip" confirmation.
messagestringyesWhat the user needs to do or provide
timeoutnumber–Max wait time in ms (default: 120000 = 2 min)
titlestring–Dialog title (default: "Agent360 - Action Required")

No output schema declared.

No examples provided.

browser_click ~392

Click an element on the page. Supports CSS selectors AND text-based selectors. Auto-scrolls element into view. Uses real mouse events (works on Angular/React SPAs and CSP-strict sites like Google, Stripe). A text selector looks inside an open modal dialog first (a <dialog> opened with showModal, or a visible element with aria-modal="true"), exact text before partial. If the mouse would not reach the target at its center - another element lies in front of it (an overlay, a dialog's backdrop), the target does not take clicks there (pointer-events, visibility, clipping), or a different control inside it would get the click (a delete button on a card; for a container that is not clickable itself, its own plain link with a real address (a hash route with a path, such as #/orders, counts; a fragment with no target on the page does not) does not count, nor does a web component's own button that covers it, nor a box with a checkbox, switch or radio role right next to a hidden field and the only one in the nearest label around it, a label of that field (a box inside a closed shadow root cannot be seen and is not counted), which counts as that field) - the answer is ok:false with error "covered" and covered_by. Found before the mouse is sent, nothing is sent; if it comes in front afterwards, the rest of the presses and clicks are stopped (a release the page moves elsewhere is let through), and the answer also has maybe_landed: true, because the page may already have reacted. Examples: "button:text(Get started)", "text=Submit", "#my-button", "a.btn-primary"

NameTypeReqDescription
selectorstringyesCSS selector or text selector. Text formats: "text=Click me" (any element), "button:text(Submit)" (specific tag)

No output schema declared.

No examples provided.

browser_click_xy ~166

ESCAPE HATCH: Click at raw viewport coordinates (CSS pixels) with fully trusted mouse events. Use when a visible button resists every selector strategy (Azure portal dialogs, Knockout-bound divs, canvas UIs): take a screenshot, read the button's position, click its center. Coordinates are CSS pixels, NOT image pixels: convert with the viewport line browser_screenshot returns: x_css = x / W * css_width and y_css = y / W * css_width, where (x, y) is the point in the image and W is the width the image is shown to you at.

NameTypeReqDescription
xnumberyesX coordinate (CSS pixels, from left of viewport)
ynumberyesY coordinate (CSS pixels, from top of viewport)

No output schema declared.

No examples provided.

browser_close_tab ~45

Close a browser tab by ID. Only tabs owned by the current session can be closed.

NameTypeReqDescription
tab_idnumberyesTab ID to close (get from browser_list_tabs)

No output schema declared.

No examples provided.

browser_console_logs ~55

Get recent console.log/warn/error messages from the page. Installs a lightweight interceptor on first call. Returns the last N console messages.

NameTypeReqDescription
countnumber–Number of recent messages to return (default: 50)

No output schema declared.

No examples provided.

browser_dismiss_overlays ~161

Dismiss visible popups, modals, tooltips, banners, and "Are you sure?"-style overlays in one call. Heuristic-based: finds close affordance via aria-label, text content (Skip/Cancel/Ikke nu/Don't show/Got it/Close), or × character button. Use when a flow is interrupted by unexpected dialogs (cookie banners, onboarding tooltips, draft-confirm prompts on Meta Ads, etc.). Returns list of what was dismissed.

NameTypeReqDescription
max_passesnumber–Number of dismissal passes (some overlays reveal others when closed). Default: 3
scopestring–non_critical (default): skip dialogs containing editable form inputs (preserves user data). aggressive: dismiss everything.

No output schema declared.

No examples provided.

browser_double_click ~317

True double-click on an element (two trusted press/release pairs with escalating clickCount). Use for open-item actions (calendar events, file lists) where two single clicks would trigger inline-rename instead (e.g. OWA month view). If the mouse would not reach the target at its center - another element lies in front of it (an overlay, a dialog's backdrop), the target does not take clicks there (pointer-events, visibility, clipping), or a different control inside it would get the click (a delete button on a card; for a container that is not clickable itself, its own plain link with a real address (a hash route with a path, such as #/orders, counts; a fragment with no target on the page does not) does not count, nor does a web component's own button that covers it, nor a box with a checkbox, switch or radio role right next to a hidden field and the only one in the nearest label around it, a label of that field (a box inside a closed shadow root cannot be seen and is not counted), which counts as that field) - the answer is ok:false with error "covered" and covered_by. Found before the mouse is sent, nothing is sent; if it comes in front afterwards, the rest of the presses and clicks are stopped (a release the page moves elsewhere is let through), and the answer also has maybe_landed: true, because the page may already have reacted.

NameTypeReqDescription
selectorstringyesCSS or text selector

No output schema declared.

No examples provided.

browser_drop_file ~419

Handing a file to the page needs "Allow access to file URLs" for the Agent360 Browser MCP extension (off by default for Chrome Web Store installs); that switch also lets the extension open any local file as a page, so whether to turn it on is the user's call. A "Not allowed" error from the handoff is reported as file-access-off unless Chrome confirms that file access is on. Upload a file when browser_upload_file fails. Two strategies: (1) uses the target itself when it is a file input, or a hidden <input type="file"> inside it; (2) if there is none, clicks the target and intercepts the NATIVE OS file-chooser it opens - pass the selector of the button that opens the dialog, and the file is supplied programmatically without the dialog ever appearing. Other file inputs on the page do not get the file: when neither strategy works, the error lists them in other_file_inputs, each with a `selector` to pass if it is the right field - a CSS selector that matched that input alone when the tool looked (built from its id, its name or its position on the page), or null when none did, for instance for an input inside a shadow root. The answer describes the input that got the file in `input`. If the field is empty afterwards although the page's change handler saw the file in it, the answer is ok with cleared_by_page: true and seen_in_field - X and Facebook empty the field after reading the file, and a page that rejects the file can do the same, so check the page before attaching again. Files must be regular files inside the working directory the MCP server runs in - folders, symlinks and hardlinks that point outside it are refused.

NameTypeReqDescription
filestring–Single absolute file path. Alias: `file_path`.
filesarray–Array of absolute file paths
selectorstringyesCSS selector for the drop-zone target element (e.g. ".upload-area")

No output schema declared.

No examples provided.

browser_execute_script ~214

Execute JavaScript in the current page, through the Chrome debugger (Runtime.evaluate) in the page's own context: the page's globals are visible and its Content Security Policy does not block it. A returned promise is awaited. If the code throws, the answer is ok:false with error and name, and the code is not run again. The call answers within 29.5 s; if the time runs out before the code is sent, the answer is error call-timeout with sent:false (nothing ran). IMPORTANT: the parameter is `code` (NOT `script` - though that alias is accepted), and it must be an EXPRESSION, not statements: use an IIFE `(() => { ...; return x; })()`. Top-level `return` is a syntax error (the handler wraps code in parentheses).

NameTypeReqDescription
codestringyesJavaScript EXPRESSION to evaluate in page context. For multi-statement logic use an IIFE: (() => { ...; return result; })()

No output schema declared.

No examples provided.

browser_extract_list ~456

Read the rows of a long or virtualised list by scrolling its container until no new rows appear. Use this instead of browser_get_page_content whenever a page shows a repeating list longer than the viewport - mail lists (Outlook, Gmail), invoice/billing tables, search results, transaction histories. Those UIs keep only ~7 rows in the DOM at a time, so a single page read returns a sliver and looks complete. Pass the CSS selector of one repeating row (e.g. '[role="option"]', 'tr', '[role="listitem"]'); the scrollable ancestor is found automatically. When the tab is the active one in its window, it scrolls with real wheel events, also at the bottom, so a feed that loads more rows on wheel (Threads, X) loads them. A hidden page (a background tab) gets no wheel or scroll events, IntersectionObserver callbacks or animation frames, so a list that loads or renders rows while you scroll stops at what is already there; then reached_end is false and `note` says why. Returns deduplicated row text, scroll_method (wheel or script) and reached_end, which is true only when the list stood at its bottom in a visible page with no new rows, growth or movement for stable_rounds rounds in a row. If the selector matches no rows with text, the answer is error "no-rows".

NameTypeReqDescription
containerstring–Optional CSS selector for the scrollable container. Omit to auto-detect the row's nearest scrollable ancestor.
max_rowsnumber–Stop after this many unique rows (default 500, max 5000)
scroll_stepnumber–Pixels per scroll. Omit for 85% of the container height.
selectorstringyesCSS selector matching ONE repeating row (e.g. '[role="option"]' in Outlook, 'tr' in a table)
stable_roundsnumber–Rounds in a row with no new rows, growth or movement before stopping, and at the bottom before reached_end (default 3)
wait_msnumber–Wait after each scroll so new rows can render (default 350)

No output schema declared.

No examples provided.

browser_extract_token ~153

Open a known provider's API page (stripe, hubspot, slack, shopify, mailchimp, pipedrive, calendly, google, linkedin) and get instructions for finding or creating its API credentials there. It reads nothing itself: read the page with browser_get_page_content or browser_screenshot afterwards. For HubSpot, Slack, Shopify and LinkedIn the page is a settings or app list on the way to the token, not the token page itself. Any other provider answers Unknown provider; use browser_navigate and read the page yourself.

NameTypeReqDescription
providerstringyesOne of: stripe, hubspot, slack, shopify, mailchimp, pipedrive, calendly, google, linkedin

No output schema declared.

No examples provided.

browser_fetch ~138

Make an HTTPS request from the extension background. It is not subject to the page's CORS or CSP, so it works for API calls (Google, Stripe, Slack) where a fetch from the page would be blocked. Your browser cookies are not sent and the answer's cookies are not stored: pass a token in headers. Plain http works only to 127.0.0.1.

NameTypeReqDescription
bodystring–Request body (for POST/PUT)
headersobject–Request headers as key-value pairs
methodstring–HTTP method (default: GET)
urlstringyesURL to fetch

No output schema declared.

No examples provided.

browser_fill ~135

Fill a form input field with a value. Supports CSS selectors AND text-based selectors. Auto-scrolls and focuses the element. Works on CSP-strict sites via Chrome Debugger API. For date inputs use browser_set_date, for autocomplete/combobox use browser_set_combobox. With a text selector the field is clicked first, so the same check as browser_click applies: if the mouse would not reach it at its center, nothing is typed and the answer is ok:false with error "covered".

NameTypeReqDescription
selectorstringyesCSS selector or text selector for the input field
valuestringyesValue to fill in

No output schema declared.

No examples provided.

browser_get_cookies ~83

Get cookies for a site this session has open in one of its tabs (the site itself, a parent domain or a subdomain). Navigate to the site first - cookies for sites the session is not working on are refused.

NameTypeReqDescription
domainstringyesDomain to get cookies for (e.g. ".stripe.com"). Must match a tab this session has open.

No output schema declared.

No examples provided.

browser_get_local_storage ~47

Read localStorage from the current page. Pass key for a specific value, or omit for all.

NameTypeReqDescription
keystring–Specific localStorage key to read (omit for all)

No output schema declared.

No examples provided.

browser_get_new_tab ~33

Get the most recently opened tab (useful after clicking links that open new tabs, OAuth popups, etc.).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

browser_get_page_content ~171

Get the content of the current page as text or HTML. Pass `selector` to read one part of a large page instead of all of it - on a big logged-in app the full HTML can run past a million characters. The answer is capped at 30000 characters by default and says so when it had to cut, with the real length, so a truncated page is never mistaken for a whole one.

NameTypeReqDescription
formatstring–Output format (default: text)
max_charsnumber–Cap on returned characters (default: 30000). Over the cap the answer carries truncated: true and total_chars.
selectorstring–CSS selector. Reads only that element instead of the whole page. If it matches nothing the call fails rather than silently returning the whole page.

No output schema declared.

No examples provided.

browser_handle_dialog ~252

Answer a JavaScript alert/confirm/prompt or "Leave site?" on the active tab. If a dialog this extension saw open is on screen and nobody is answering it, it is answered now, and the reply says what Chrome reports happened (action accept or dismiss). Otherwise this arms automatic handling of the next dialog on the tab and returns immediately - call it BEFORE the click that opens the dialog, because a dialog freezes the tab. Pass wait=true only when the dialog is already opening. Errors: dialog-being-answered (browser_navigate or an earlier call is answering it - wait), dialog-unconfirmed (answered, but Chrome did not confirm it closed), tab-not-responding (a dialog that opened before anything listened, or a busy page; the note says what to do).

NameTypeReqDescription
actionstring–Accept or dismiss the dialog (default: accept)
textstring–Text to enter for prompt() dialogs
timeoutnumber–How long the arming stays active in ms (default: 60000)
waitboolean–Block until a dialog appears instead of arming and returning (default: false). Only use when the dialog is already on its way.

No output schema declared.

No examples provided.

browser_hover ~167

Hover over an element to trigger tooltips, dropdown menus, or hover states. Supports CSS and text selectors. If the mouse would not reach the target at its center - another element lies in front of it (an overlay, a dialog's backdrop), or the target does not take clicks there (pointer-events, visibility, clipping) - the answer is ok:false with error "covered" and covered_by. Found before the mouse is sent, nothing is sent; if it comes in front afterwards, the rest of the mouse movement is stopped and the answer also has maybe_landed: true, because the page may already have reacted.

NameTypeReqDescription
durationnumber–How long to hold hover in ms (default: 500)
selectorstringyesCSS or text selector to hover over

No output schema declared.

No examples provided.

browser_list_frames ~26

List all frames (iframes) in the current page with their URLs and indices.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

browser_list_tabs ~62

List the tabs this session owns (tabs it opened or adopted): id, URL, title, and each tab's active flag (whether Chrome shows it in front of its window, not which tab this session is working in). Tabs of other sessions are not included.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

browser_navigate ~818

Navigate the active browser tab to a URL. Reuses the current tab by default (no tab spam). Pass new_tab=true only when you need to keep the current page open. In the current tab the answer is ok:true only when Chrome took the address and the new page is proven loaded within about 25 s (the wait ends half a second before that limit). If the page asks "Leave site?", the default answer is Stay (an armed browser_handle_dialog answers instead) and the reply is error beforeunload-blocked with the tab's actual url: the page may hold unsaved work, so ask the user (browser_ask_user) before you call again with leave_page:true. Other errors, each with sent (was the address sent to Chrome?) and a note on what to do: navigation-in-progress (another navigate is working in this tab, or - with op_id null - an earlier answer to a dialog on the tab is not confirmed yet; wait a moment), dialog-open (a dialog is on screen - answer it with browser_handle_dialog), tab-not-responding (busy page, or a dialog Chrome does not show us), navigation-failed, dialog-unconfirmed, navigation-unconfirmed (no load proven in time; may_complete_later and pending_url say it can still happen - read the tab before sending it again; a download or a 204 answer never loads a page and ends here too), tab-closed (Chrome no longer has the tab), session-changed (another call changed the session's active tab while this one waited; nothing was sent).

NameTypeReqDescription
eget_vindueboolean–Requires new_tab. Opens the page in its own Chrome window, without focus unless you pass fokuser:true. Whether Chrome delivers mouse and keyboard input to a window without focus is unmeasured in desk…
fokuserboolean–With eget_vindue: ASK for the new window to get the operating system's focus. Chrome can refuse it. The reply carries what actually happened - read `fokuseret` and `placeret_som_bedt` rather than ass…
leave_pageboolean–Answer "Leave site?" with Leave instead of Stay (default: false), so unsaved changes on the current page are lost. Only after the user has agreed (browser_ask_user). An armed browser_handle_dialog on…
new_tabboolean–Open in new tab instead of reusing current (default: false). If the session's only tab is still an empty about:blank placeholder, that tab is used instead of opening another.
urlstringyesURL to navigate to
vindue_breddenumber–With eget_vindue: window width in points.
vindue_hoejdenumber–With eget_vindue: window height in points.
vindue_xnumber–With eget_vindue: the window's left edge in global screen points. A NEGATIVE value is a display to the left of the main one - that is how you put it on another screen. No tool lists the displays: use…
vindue_ynumber–With eget_vindue: the window's top edge in global screen points.

No output schema declared.

No examples provided.

browser_press_key ~292

Press a keyboard key (Enter, Tab, Escape, ArrowDown, etc.). Useful for submitting forms, navigating dropdowns, closing dialogs. Supports modifier keys (ctrl, alt, shift, meta). While ctrl, meta or alt is held, no character is typed. With ctrl or meta (and no shift), the letters a, c, x, v, z and y are sent with Chrome's own editing command - select all, copy, cut, paste, undo, redo; z with shift is redo - including on macOS, where Chrome runs no shortcut for a synthetic key without it. The answer names the command that was sent in `shortcut`; `landed` says the page received the key, not what the command did. Paste inserts the user's real clipboard into the page, and copy and cut replace what is on it.

NameTypeReqDescription
altboolean–Hold Alt key
codestring–Key code (optional, defaults to key name). E.g. "KeyA" for "a"
ctrlboolean–Hold Ctrl/Cmd key
keystringyesKey to press: "Enter", "Tab", "Escape", "ArrowDown", "ArrowUp", "Backspace", "a", "1", etc.
metaboolean–Hold Meta (Cmd on Mac) key
shiftboolean–Hold Shift key

No output schema declared.

No examples provided.

browser_provide_feedback ~598

Self-diagnosis + feedback in one call. Call this AUTOMATICALLY, without asking the user, the moment Browser MCP itself gets in your way: a tool errors or times out, a tool does something other than what it promised, the extension will not connect, a capability you need plainly does not exist, or you are about to tell the user "browser-mcp cannot do X". It first CHECKS THE INSTALL - the connected Chrome extension's version against this server (set BROWSER_MCP_CHECK_NPM=1 to also compare this server against the latest published on npm; it is off by default so the call stays fast and works offline), and whether more than one Browser MCP extension is connected at once, also the same extension connected more than once, for instance from several Chrome profiles or browsers (a known cause of tabs and sessions behaving randomly) - so a problem that is really "your copy is outdated" or "you have two extensions loaded" is identified as such instead of reported as a bug. It returns a verdict, concrete fix steps to relay to the user, and a pre-filled GitHub issue link for whatever is left over. Cheap to call speculatively. It uploads nothing: it returns the report to you and tries to add one line to ~/.browser-mcp/feedback.jsonl on this machine (a report with the same kind, tool and first 160 characters of what_happened, with numbers and long hex strings ignored, is written once per server run, and again only if the earlier write failed; logged_locally says whether a line was written). Email addresses and numbers of six or more characters are replaced with [email] and [number] in what_happened, attempted and worked before they are written or put in the issue link. With BROWSER_MCP_CHECK_NPM=1 it also runs `npm view` against your configured npm registry.

NameTypeReqDescription
attemptedstring–What you already tried (other selectors, other tools, retries) so the report does not suggest what you have ruled out.
kindstring–"blocked" = you could not complete the task (default). "broken" = a tool misbehaved or lied about its result. "missing" = the capability does not exist. "wish" = a feature idea. "use_case" = somethin…
toolstring–The browser_* tool involved, e.g. "browser_click". Omit if none in particular.
urlstring–The page it happened on, if relevant. Strip query strings that contain tokens.
what_happenedstringyesRequired. What you tried and what actually happened, in one or two plain sentences. Include the exact error text if there was one.
workedstring–The route that did work in the end, if any. This is the most useful part.

No output schema declared.

No examples provided.

browser_reattach_debugger ~70

RECOVERY: Force-detach and re-attach the Chrome debugger on the current tab. Use when interactive tools (click/fill/press_key) start timing out or reporting ghost-attach ("Debugger attach failed ... ghost") while list_tabs still works - faster than reloading the extension.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

browser_right_click ~186

Right-click an element (trusted CDP mouse events) to open page-level context menus (web apps like OWA/Google Docs render their own). Note: Chrome's NATIVE context menu does not open via CDP - only in-page menus. If the mouse would not reach the target at its center - another element lies in front of it (an overlay, a dialog's backdrop), or the target does not take clicks there (pointer-events, visibility, clipping) - the answer is ok:false with error "covered" and covered_by. Found before the mouse is sent, nothing is sent; if it comes in front afterwards, the rest of the presses and clicks are stopped (a release the page moves elsewhere is let through), and the answer also has maybe_landed: true, because the page may already have reacted.

NameTypeReqDescription
selectorstringyesCSS or text selector

No output schema declared.

No examples provided.

browser_screenshot ~166

Take a screenshot of the visible area of the current tab. Returns base64 PNG, or saves to disk if path is provided. The image is in device pixels; when Chrome reports them in time, the answer also gives the CSS viewport size and devicePixelRatio, which browser_click_xy coordinates need. Chrome stays where it is: if its window is covered by other windows, there is no picture and the answer is error "window-covered".

NameTypeReqDescription
bring_to_frontboolean–Raise Chrome in front of the user if its window is covered, and leave it there. Takes the user's screen: only after the user agreed (browser_ask_user). Default false.
pathstring–File path to save the screenshot to (e.g. /path/to/screenshot.png)

No output schema declared.

No examples provided.

browser_scroll ~85

Scroll the page to an element or by pixel amount. Useful for reaching elements below the fold.

NameTypeReqDescription
selectorstring–CSS or text selector to scroll to (element scrolled into center of viewport)
xnumber–Pixels to scroll horizontally (positive = right)
ynumber–Pixels to scroll vertically (positive = down, e.g. 500)

No output schema declared.

No examples provided.

browser_select_frame ~216

Execute JavaScript in a specific frame by frame index, through the Chrome debugger in that frame's own context - also a frame from another site. Use browser_list_frames first to find the right index. A returned promise is awaited; without code it returns the frame's text (first 5000 characters). The frame is identified by a one-time mark the extension puts in that frame's document, not by its address or position; if the mark is not found, nothing is run (error frame-not-reachable, and retry says whether calling again can help; a frame whose document is replaced while the call looks for it gives retry: true). The call answers within 29.5 s; if the time runs out before the code is sent, the answer is error call-timeout with sent:false (nothing ran).

NameTypeReqDescription
codestring–JavaScript EXPRESSION to evaluate in the frame (default: returns its text content)
frame_indexnumberyesFrame index from browser_list_frames (0 = main frame)

No output schema declared.

No examples provided.

browser_select_option ~380

Select an option from a dropdown menu. Works with native <select> elements AND custom dropdowns (Angular Material, React Select, etc.). For custom dropdowns: clicks the trigger, waits for options, then clicks the matching option by text. For autocomplete (typing filters options) use browser_set_combobox instead. A custom dropdown's trigger gets the same check as browser_click: if the mouse would not reach it at its center, nothing is opened and the answer is ok:false with error "covered". So does the option once the list is open: if it is covered, it is not clicked, and the answer is ok:false with error "covered" and trigger_clicked: true - the list may still be open. If the click on the trigger was sent, but neither its press is shown to have reached it nor its click landed, no option is clicked and the answer is ok:false with maybe_landed: true; a click that cannot be checked in the page is not sent, and the answer says so; if it opens a dialog, or the option is not found, the answer has trigger_clicked: true.

NameTypeReqDescription
optionstringyesText OR value of the option to select. Exact value match wins, then exact text, then partial text. Aliases: `value`, `label`. Fails loudly with the available options if nothing matches. A controlled…
selectorstringyesCSS or text selector for the dropdown trigger / <select> element
waitnumber–Ms to wait after clicking trigger for options to appear (default: 300)

No output schema declared.

No examples provided.

browser_set_combobox ~210

Set value(s) on an autocomplete/combobox input. Handles the click → type query → wait for filtered listbox → click option flow as one MCP call. Supports multi-select (e.g., Languages on Meta Ads). Use when browser_select_option fails because options render lazily after typing.

NameTypeReqDescription
multiboolean–True if combobox accepts multiple values (chips). Default: auto-detected from presence of values array
query_charsnumber–How many characters to type as filter query (default: 4 or full value length, whichever is smaller)
selectorstringyesCSS selector for the combobox/autocomplete input
valuestring–Single value to select (use this OR values)
valuesarray–Array of values for multi-select. E.g. ["Danish", "English", "Swedish"]
wait_msnumber–Max ms to wait for options listbox to appear after typing (default: 3000)

No output schema declared.

No examples provided.

browser_set_cookies ~140

Set one or more cookies for a domain.

NameTypeReqDescription
cookiesarray–Array of cookie objects to set multiple at once
domainstring–Cookie domain (e.g. ".example.com")
httpOnlyboolean–HttpOnly flag (default: false)
namestringyesCookie name
pathstring–Cookie path (default: /)
sameSitestring–SameSite attribute (default: lax)
secureboolean–Secure flag (default: true)
urlstring–URL for the cookie (alternative to domain)
valuestringyesCookie value

No output schema declared.

No examples provided.

browser_set_date ~165

Robustly set a date input - handles native <input type="date">, masked text inputs (e.g. MM/DD/YYYY), and calendar pickers (MUI, react-datepicker, AntD, Lexical/Meta). Tries native value-set, format-aware typing via Input.insertText, and ARIA-based picker navigation in sequence with read-back verification. Use instead of browser_fill when fill fails or for any input that opens a calendar widget.

NameTypeReqDescription
datestringyesISO date string (YYYY-MM-DD), e.g. "2026-05-15"
selectorstringyesCSS selector for the date input element
skip_pickerboolean–If true, only try native + masked paths and skip calendar-picker navigation (default: false)

No output schema declared.

No examples provided.

browser_set_local_storage ~46

Set a localStorage key-value pair on the current page.

NameTypeReqDescription
keystringyeslocalStorage key to set
valuestringyesValue to store (string)

No output schema declared.

No examples provided.

browser_solve_captcha ~320

Detect CAPTCHAs on the current page and work through them, one action per call. "detect" reports reCAPTCHA v2/v3, hCaptcha, Cloudflare Turnstile and FunCaptcha. "click_checkbox" tries the reCAPTCHA checkbox and detects again. "click_grid" clicks the reCAPTCHA image-challenge cells you choose; this tool returns no image, so take one with browser_screenshot first. "ask_human" returns the message to show the user with browser_ask_user.

NameTypeReqDescription
actionstring–Action to take. "detect" scans for CAPTCHAs. "click_checkbox" clicks the reCAPTCHA checkbox. "click_grid" clicks specific reCAPTCHA grid cells (pass cells, and grid 3 or 4). "ask_human" returns the m…
cellsarray–Grid cell indices to click (0-indexed, left-to-right, top-to-bottom) for image challenges. E.g. [2, 5, 7] to click cells 3, 6, 8. Pass grid to say which grid you see; without it, the grid is read as…
gridnumber–For click_grid: the size of the reCAPTCHA image grid in your screenshot, 3 (3x3) or 4 (4x4).

No output schema declared.

No examples provided.

browser_switch_tab ~122

Switch to a specific browser tab by ID. Get tab IDs from browser_list_tabs or browser_get_new_tab. The other tools then act on that tab. Chrome is not brought in front of the user: the tab is made active in its window, and visibility says whether the page is hidden behind other windows.

NameTypeReqDescription
bring_to_frontboolean–Also bring the Chrome window in front of the user. Takes the user's screen: only after the user agreed (browser_ask_user). Default false.
tab_idnumberyesTab ID to switch to

No output schema declared.

No examples provided.

browser_upload_file ~294

Handing a file to the page needs "Allow access to file URLs" for the Agent360 Browser MCP extension (off by default for Chrome Web Store installs); that switch also lets the extension open any local file as a page, so whether to turn it on is the user's call. A "Not allowed" error from the handoff is reported as file-access-off unless Chrome confirms that file access is on. Upload a file to a <input type="file"> element on the page. Uses Chrome Debugger API to set files programmatically - no dialog needed. For drag-drop zones without visible file input use browser_drop_file. If the field is empty afterwards although the page's change handler saw the file in it, the answer is ok with cleared_by_page: true and seen_in_field - X and Facebook empty the field after reading the file, and a page that rejects the file can do the same, so check the page before attaching again. Files must be regular files inside the working directory the MCP server runs in - folders, symlinks and hardlinks that point outside it are refused.

NameTypeReqDescription
filestring–Single file path (alternative to files array). Alias: `file_path`.
filesarrayyesArray of absolute file paths to upload. E.g. ["/Users/me/photo.jpg"]
selectorstring–CSS selector for the file input (default: input[type="file"])

No output schema declared.

No examples provided.

browser_wait ~73

Wait for an element to appear on the page. Supports CSS and text-based selectors.

NameTypeReqDescription
selectorstringyesCSS selector or text selector (e.g. "text=Success", "button:text(Next)") to wait for
timeoutnumber–Max wait time in ms (default: 10000)

No output schema declared.

No examples provided.

browser_wait_for_network ~95

Wait for a network request to complete. Useful after clicking buttons that trigger API calls - ensures data is loaded before reading the page. Monitors real network traffic via Chrome DevTools Protocol.

NameTypeReqDescription
timeoutnumber–Max wait in ms (default: 15000)
url_patternstring–Substring to match in the request URL (e.g. "/api/users", "graphql"). Empty = any request.

No output schema declared.

No examples provided.

Install

How do I install the Agent360 Browser MCP server?

Agent360 Browser MCP runs locally as an npm package, launched with npx -y @agent360/browser-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @agent360/browser-mcp

# add to Claude Code
claude mcp add agent360dk-browser-mcp -- npx -y @agent360/browser-mcp
Common questions

What is the Agent360 Browser MCP server?

Agent360 Browser MCP is listed in the public MCP registry as io.github.Agent360dk/browser-mcp. Drive your real, logged-in Chrome from any AI agent - 40 tools. Needs our Chrome extension too. This page covers its npm package (@agent360/browser-mcp).

Is the Agent360 Browser MCP server safe to use?

Agent360 Browser MCP scores 91 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Agent360 Browser MCP server expose?

Agent360 Browser MCP exposes 40 tools: browser_navigate, browser_get_page_content, browser_extract_list, browser_screenshot, browser_execute_script, and 35 more. Their descriptions and schemas cost roughly 8,456 tokens of context every time the server is loaded.

Is the Agent360 Browser MCP server still maintained?

Agent360 Browser MCP is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Agent360 Browser MCP server under?

Agent360 Browser MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.